Non-B DNA structures across splice-sites

To investigate if non-B DNA structures can affect splicing, we explore the distribution of different motifs that are associated with Non-B DNA structures. We calculated the number of these motifs that can be found across splice sites (.num files) and then we calculated the positional enrichment of these across splice sites.

library(readr)
library(data.table)
library(ggplot2)
library(plyr)
library(cowplot)
library(Hmisc)

On this report we compile all the data analysis that lead us to get the final figures. For this, we processed several a

read_dist_table <- function(path){
  
dist_table <- data.table(read_delim(path, 
    "\t", escape_double = FALSE, col_names = FALSE, 
    trim_ws = TRUE))
dist_table <- dist_table[, 2:2001]
dist_table <- data.table(as.data.frame(t(dist_table)))
colnames(dist_table) <- c("Position", "Occurrences")
dist_table[,median:=median(Occurrences)]
dist_table[, Enrrichment:=Occurrences/median]
dist_table[, Position:=Position-1]
return(dist_table)  
}
plot_density <- function(up_plus, up_minus, down_plus, down_minus){
  
  up_TOTAL <-  merge(up_plus, up_minus, by="Position")
  up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  up_TOTAL[,median:=median(Occurrences)]
  up_TOTAL[, Enrrichment:=Occurrences/median]
  up_TOTAL[, Position:=Position-1]
  
  
  down_TOTAL <-  merge(down_plus, down_minus, by="Position")
  down_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  down_TOTAL[,median:=median(Occurrences)]
  down_TOTAL[, Enrrichment:=Occurrences/median]
  down_TOTAL[, Position:=Position-1]
  
  up_TOTAL[ ,exon_pos:="Upstream"]
  down_TOTAL[ ,exon_pos:="Downstream"]
  
  TOTAL <- rbind(up_TOTAL, down_TOTAL)
  
  TOTAL$exon_pos <-  factor(TOTAL$exon_pos, levels=c("Upstream", "Downstream" )) 
  
  p <- ggplot(TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment)) +
    facet_grid( . ~ exon_pos ) +
    theme_bw()
  
  show(p)
  
  TOTAL
  
  
}
plot_density_binomial <- function(up_plus, up_minus, down_plus, down_minus, observations, sig){
  
  up_TOTAL <-  merge(up_plus, up_minus, by="Position")
  up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  
  
  
  up_TOTAL <- cbind(up_TOTAL, up_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
  up_TOTAL[,median:=median(PointEst)]
  up_TOTAL[, Enrrichment:=PointEst/median]
  up_TOTAL[, Enrrichment_l:=Lower/median]
  up_TOTAL[, Enrrichment_u:=Upper/median]
  up_TOTAL[, Position:=Position-1]
  
  
  down_TOTAL <-  merge(down_plus, down_minus, by="Position")
  down_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  
  down_TOTAL <- cbind(down_TOTAL, down_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
  down_TOTAL[,median:=median(PointEst)]
  down_TOTAL[, Enrrichment:=PointEst/median]
  down_TOTAL[, Enrrichment_l:=Lower/median]
  down_TOTAL[, Enrrichment_u:=Upper/median]
  down_TOTAL[, Position:=Position-1]  
  
  
  up_TOTAL[ ,exon_pos:="Upstream"]
  down_TOTAL[ ,exon_pos:="Downstream"]
  
  TOTAL <- rbind(up_TOTAL, down_TOTAL)
  
  TOTAL$exon_pos <-  factor(TOTAL$exon_pos, levels=c("Upstream", "Downstream" )) 
  
  p <- ggplot(TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment)) +
    geom_ribbon(aes(ymin=Enrrichment_l, ymax=Enrrichment_u, x=Position), alpha=0.3 )+
    facet_grid( . ~ exon_pos ) +
    theme_bw()
  
  show(p)
  
  return(TOTAL) 
  
}

G-Quadruplexes

G4.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.up_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.up_plus.list.out.num'
G4.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.down_plus.list.out.num'
G4.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.up_minus.list.out.num'
G4.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/G4.exon.down_minus.list.out.num'
G4.up_minus[,Position:=Position*-1]
G4.down_minus[,Position:=Position*-1]
G4.TOTAL <- plot_density(G4.up_plus, G4.up_minus, G4.down_plus, G4.down_minus) 

Directed repeats

DR.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.up_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.up_plus.list.out.num'
DR.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.down_plus.list.out.num'
DR.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.up_minus.list.out.num'
DR.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/DR.exon.down_minus.list.out.num'
DR.up_minus[,Position:=Position*-1]
DR.down_minus[,Position:=Position*-1]
DR.TOTAL <- plot_density(DR.up_plus, DR.up_minus, DR.down_plus, DR.down_minus)

H-DNA

H_DNA.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_minus.list.out.num'
H_DNA.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_plus.list.out.num'
H_DNA.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.up_minus.list.out.num'
H_DNA.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/H_DNA.exon.down_minus.list.out.num'
H_DNA.up_minus[,Position:=Position*-1]
H_DNA.down_minus[,Position:=Position*-1]
H_DNA.TOTAL <- plot_density(H_DNA.up_plus, H_DNA.up_minus, H_DNA.down_plus, H_DNA.down_minus)

Inverted repeat

IR.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_minus.list.out.num'
IR.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_plus.list.out.num'
IR.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.up_minus.list.out.num'
IR.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/IR.exon.down_minus.list.out.num'
IR.up_minus[,Position:=Position*-1]
IR.down_minus[,Position:=Position*-1]
IR.TOTAL <- plot_density(IR.up_plus, IR.up_minus, IR.down_plus, IR.down_minus)

Mirror repeat

MR.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_minus.list.out.num'
MR.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_plus.list.out.num'
MR.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.up_minus.list.out.num'
MR.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/MR.exon.down_minus.list.out.num'
MR.up_minus[,Position:=Position*-1]
MR.down_minus[,Position:=Position*-1]
MR.TOTAL <- plot_density(MR.up_plus, MR.up_minus, MR.down_plus, MR.down_minus)

Short tandem repeat

STR.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_minus.list.out.num'
STR.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_plus.list.out.num'
STR.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.up_minus.list.out.num'
STR.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/STR.exon.down_minus.list.out.num'
STR.up_minus[,Position:=Position*-1]
STR.down_minus[,Position:=Position*-1]
STR.TOTAL <- plot_density(STR.up_plus, STR.up_minus, STR.down_plus, STR.down_minus)

Z-DNA

Z_DNA.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_minus.list.out.num'
Z_DNA.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_plus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_plus.list.out.num'
Z_DNA.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.up_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.up_minus.list.out.num'
Z_DNA.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_minus.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/Z_DNA.exon.down_minus.list.out.num'
Z_DNA.up_minus[,Position:=Position*-1]
Z_DNA.down_minus[,Position:=Position*-1]
Z_DNA.TOTAL <- plot_density(Z_DNA.up_plus, Z_DNA.up_minus, Z_DNA.down_plus, Z_DNA.down_minus)

All Non-B DNA motifs

G4.TOTAL[, Non_B:="G4"]
DR.TOTAL[, Non_B:="DR"]
H_DNA.TOTAL[, Non_B:="H DNA"]
IR.TOTAL[, Non_B:="IR"]
MR.TOTAL[, Non_B:="MR"]
STR.TOTAL[, Non_B:="STR"]
Z_DNA.TOTAL[, Non_B:="Z DNA"]
Non_B.TOTAL <- rbind(G4.TOTAL, DR.TOTAL, H_DNA.TOTAL, IR.TOTAL, MR.TOTAL, STR.TOTAL, Z_DNA.TOTAL)
Fig1.A <- ggplot(Non_B.TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment)) +
    xlim(c(-300,300)) +
    facet_grid( Non_B ~ exon_pos ) +
  theme_bw()
Fig1.A

Non_B.TOTAL.Enrrichment_Peak <- Non_B.TOTAL[ , .(Enrrichment_Peak=max(Enrrichment)) , by = c("Non_B", "exon_pos" )]
write.table(Non_B.TOTAL.Enrrichment_Peak, file = "Non_B.TOTAL.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

Distribution of non-B DNA motifs across weak and strong splice sites

We calculated the distribution of non-B DNA motifs across quartiles of splice strength, where Q1 are the weakest splice sites and Q4 are the strongest.

Merge_Qs <- function(Qs.list, window_len, strand ) {
  
  Total_Qs <- data.table(rbindlist(Qs.list))
  Q_names <- seq(nrow(Total_Qs)/window_len)
  Total_Qs[, Q:=rep(Q_names, each=window_len)]
  
  if(strand=="-"){
    
    Total_Qs[,Position:=Position*-1]
  }
  
  Total_Qs
}
merge_plus_minus <- function(plus, minus){
  TOTAL <- merge(plus, minus, by=c("Position", "Q") )
  TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  TOTAL[,median:=median(Occurrences),  by=c("Q")]
  TOTAL[, Enrrichment:=Occurrences/median]
  TOTAL[, Position:=Position-1]
  
}
Merge_up_down <- function(Qs.up, Qs.down){
  Qs.total <- rbind(Qs.up, Qs.down)
  
  half_n <- nrow(Qs.total)/2
  Qs.total[, exon_pos:=rep(c("Upstream", "Downstream"), each=half_n) ]
  
  
  Qs.total$exon_pos <-  factor(Qs.total$exon_pos, levels=c("Upstream", "Downstream" ))
  Qs.total$Q <-  factor(Qs.total$Q)
  
  Qs.total
  
}
get_total_Qs <- function(Qs.plus.up.list, Qs.minus.list, Qs.plus.down.list, Qs.minus.down.list, window_len){
  Qs.plus.up <- Merge_Qs(Qs.plus.up.list, window_len, strand="+")
  Qs.minus.up <- Merge_Qs(Qs.minus.list, window_len, strand="-")
  Qs.up <- merge_plus_minus(Qs.plus.up, Qs.minus.up)
  
  Qs.plus.down <- Merge_Qs(Qs.plus.down.list, window_len, strand="+")
  Qs.minus.down<- Merge_Qs(Qs.minus.down.list, window_len, strand="-")
  Qs.down <- merge_plus_minus(Qs.plus.down, Qs.minus.down)
  
  Qs.total <- Merge_up_down(Qs.up, Qs.down)
  
  Qs.total
  
}
  
hg19.nexons <- 123433 + 123936
G4.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.G4.list.out.num'
G4.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.G4.list.out.num'
G4.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.G4.list.out.num'
G4.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.G4.list.out.num'
G4.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.G4.list.out.num'
G4.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.G4.list.out.num'
G4.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.G4.list.out.num'
G4.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.G4.list.out.num'
G4.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.G4.list.out.num'
G4.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.G4.list.out.num'
G4.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.G4.list.out.num'
G4.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.G4.list.out.num'
G4.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.G4.list.out.num'
G4.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.G4.list.out.num'
G4.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.G4.list.out.num'
G4.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.G4.list.out.num'
G4.Qs.plus.up.list <- list(G4.Q1_up_plus, G4.Q2_up_plus, G4.Q3_up_plus, G4.Q4_up_plus)
G4.Qs.minus.list <- list(G4.Q1_up_minus, G4.Q2_up_minus, G4.Q3_up_minus, G4.Q4_up_minus)
G4.Qs.plus.down.list <- list(G4.Q1_down_plus, G4.Q2_down_plus, G4.Q3_down_plus, G4.Q4_down_plus)
G4.Qs.minus.down.list <- list(G4.Q1_down_minus, G4.Q2_down_minus, G4.Q3_down_minus, G4.Q4_down_minus)
G4.window_len = 2000
G4.Qs.total <- get_total_Qs(G4.Qs.plus.up.list, G4.Qs.minus.list, G4.Qs.plus.down.list, G4.Qs.minus.down.list, G4.window_len)
G4.Qs.total$Q <- mapvalues(G4.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-150,150)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()+labs(colour = "Splice site stregth quartile") +
   theme(legend.position = "top", legend.direction = "horizontal")

G4.Qs.total.binomial <- cbind(G4.Qs.total,  G4.Qs.total[, binconf(Occurrences, hg19.nexons/4) ])
G4.Qs.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q")]
G4.Qs.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
ggplot(G4.Qs.total.binomial)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  geom_ribbon(aes(x=Position,y=Enrrichment, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
  xlim(c(-150,150)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()+labs(colour = "Splice site stregth quartile") +
   theme(legend.position = "top", legend.direction = "horizontal")
Ignoring unknown aesthetics: y

DR.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.DRs.list.out.num'
DR.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.DRs.list.out.num'
DR.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.DRs.list.out.num'
DR.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.DRs.list.out.num'
DR.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.DRs.list.out.num'
DR.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.DRs.list.out.num'
DR.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.DRs.list.out.num'
DR.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.DRs.list.out.num'
DR.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.DRs.list.out.num'
DR.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.DRs.list.out.num'
DR.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.DRs.list.out.num'
DR.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.DRs.list.out.num'
DR.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.DRs.list.out.num'
DR.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.DRs.list.out.num'
DR.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.DRs.list.out.num'
DR.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.DRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.DRs.list.out.num'
DR.Qs.plus.up.list <- list(DR.Q1_up_plus, DR.Q2_up_plus, DR.Q3_up_plus, DR.Q4_up_plus)
DR.Qs.minus.list <- list(DR.Q1_up_minus, DR.Q2_up_minus, DR.Q3_up_minus, DR.Q4_up_minus)
DR.Qs.plus.down.list <- list(DR.Q1_down_plus, DR.Q2_down_plus, DR.Q3_down_plus, DR.Q4_down_plus)
DR.Qs.minus.down.list <- list(DR.Q1_down_minus, DR.Q2_down_minus, DR.Q3_down_minus, DR.Q4_down_minus)
DR.window_len = 2000
DR.Qs.total <- get_total_Qs(DR.Qs.plus.up.list, DR.Qs.minus.list, DR.Qs.plus.down.list, DR.Qs.minus.down.list, DR.window_len)
ggplot(DR.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15))+
  theme_bw()

NA
NA
NA
H_DNA.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.H_DNA.list.out.num'
H_DNA.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.H_DNA.list.out.num'
H_DNA.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.H_DNA.list.out.num'
H_DNA.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.H_DNA.list.out.num'
H_DNA.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.H_DNA.list.out.num'
H_DNA.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.H_DNA.list.out.num'
H_DNA.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.H_DNA.list.out.num'
H_DNA.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.H_DNA.list.out.num'
H_DNA.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.H_DNA.list.out.num'
H_DNA.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.H_DNA.list.out.num'
H_DNA.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.H_DNA.list.out.num'
H_DNA.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.H_DNA.list.out.num'
H_DNA.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.H_DNA.list.out.num'
H_DNA.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.H_DNA.list.out.num'
H_DNA.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.H_DNA.list.out.num'
H_DNA.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.H_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.H_DNA.list.out.num'
H_DNA.Qs.plus.up.list <- list(H_DNA.Q1_up_plus, H_DNA.Q2_up_plus, H_DNA.Q3_up_plus, H_DNA.Q4_up_plus)
H_DNA.Qs.minus.list <- list(H_DNA.Q1_up_minus, H_DNA.Q2_up_minus, H_DNA.Q3_up_minus, H_DNA.Q4_up_minus)
H_DNA.Qs.plus.down.list <- list(H_DNA.Q1_down_plus, H_DNA.Q2_down_plus, H_DNA.Q3_down_plus, H_DNA.Q4_down_plus)
H_DNA.Qs.minus.down.list <- list(H_DNA.Q1_down_minus, H_DNA.Q2_down_minus, H_DNA.Q3_down_minus, H_DNA.Q4_down_minus)
H_DNA.window_len = 2000
H_DNA.Qs.total <- get_total_Qs(H_DNA.Qs.plus.up.list, H_DNA.Qs.minus.list, H_DNA.Qs.plus.down.list, H_DNA.Qs.minus.down.list, H_DNA.window_len)
ggplot(H_DNA.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()

IR.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.IRs.list.out.num'
IR.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.IRs.list.out.num'
IR.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.IRs.list.out.num'
IR.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.IRs.list.out.num'
IR.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.IRs.list.out.num'
IR.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.IRs.list.out.num'
IR.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.IRs.list.out.num'
IR.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.IRs.list.out.num'
IR.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.IRs.list.out.num'
IR.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.IRs.list.out.num'
IR.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.IRs.list.out.num'
IR.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.IRs.list.out.num'
IR.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.IRs.list.out.num'
IR.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.IRs.list.out.num'
IR.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.IRs.list.out.num'
IR.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.IRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.IRs.list.out.num'
IR.Qs.plus.up.list <- list(IR.Q1_up_plus, IR.Q2_up_plus, IR.Q3_up_plus, IR.Q4_up_plus)
IR.Qs.minus.list <- list(IR.Q1_up_minus, IR.Q2_up_minus, IR.Q3_up_minus, IR.Q4_up_minus)
IR.Qs.plus.down.list <- list(IR.Q1_down_plus, IR.Q2_down_plus, IR.Q3_down_plus, IR.Q4_down_plus)
IR.Qs.minus.down.list <- list(IR.Q1_down_minus, IR.Q2_down_minus, IR.Q3_down_minus, IR.Q4_down_minus)
IR.window_len = 2000
IR.Qs.total <- get_total_Qs(IR.Qs.plus.up.list, IR.Qs.minus.list, IR.Qs.plus.down.list, IR.Qs.minus.down.list, IR.window_len)
ggplot(IR.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()

MR.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.MRs.list.out.num'
MR.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.MRs.list.out.num'
MR.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.MRs.list.out.num'
MR.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.MRs.list.out.num'
MR.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.MRs.list.out.num'
MR.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.MRs.list.out.num'
MR.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.MRs.list.out.num'
MR.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.MRs.list.out.num'
MR.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.MRs.list.out.num'
MR.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.MRs.list.out.num'
MR.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.MRs.list.out.num'
MR.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.MRs.list.out.num'
MR.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.MRs.list.out.num'
MR.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.MRs.list.out.num'
MR.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.MRs.list.out.num'
MR.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.MRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.MRs.list.out.num'
MR.Qs.plus.up.list <- list(MR.Q1_up_plus, MR.Q2_up_plus, MR.Q3_up_plus, MR.Q4_up_plus)
MR.Qs.minus.list <- list(MR.Q1_up_minus, MR.Q2_up_minus, MR.Q3_up_minus, MR.Q4_up_minus)
MR.Qs.plus.down.list <- list(MR.Q1_down_plus, MR.Q2_down_plus, MR.Q3_down_plus, MR.Q4_down_plus)
MR.Qs.minus.down.list <- list(MR.Q1_down_minus, MR.Q2_down_minus, MR.Q3_down_minus, MR.Q4_down_minus)
MR.window_len = 2000
MR.Qs.total <- get_total_Qs(MR.Qs.plus.up.list, MR.Qs.minus.list, MR.Qs.plus.down.list, MR.Qs.minus.down.list, window_len)
ggplot(MR.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()

STR.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.STRs.list.out.num'
STR.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.STRs.list.out.num'
STR.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.STRs.list.out.num'
STR.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.STRs.list.out.num'
STR.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.STRs.list.out.num'
STR.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.STRs.list.out.num'
STR.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.STRs.list.out.num'
STR.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.STRs.list.out.num'
STR.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.STRs.list.out.num'
STR.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.STRs.list.out.num'
STR.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.STRs.list.out.num'
STR.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.STRs.list.out.num'
STR.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.STRs.list.out.num'
STR.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.STRs.list.out.num'
STR.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.STRs.list.out.num'
STR.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.STRs.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.STRs.list.out.num'
STR.Qs.plus.up.list <- list(STR.Q1_up_plus, STR.Q2_up_plus, STR.Q3_up_plus, STR.Q4_up_plus)
STR.Qs.minus.list <- list(STR.Q1_up_minus, STR.Q2_up_minus, STR.Q3_up_minus, STR.Q4_up_minus)
STR.Qs.plus.down.list <- list(STR.Q1_down_plus, STR.Q2_down_plus, STR.Q3_down_plus, STR.Q4_down_plus)
STR.Qs.minus.down.list <- list(STR.Q1_down_minus, STR.Q2_down_minus, STR.Q3_down_minus, STR.Q4_down_minus)
STR.window_len = 2000
STR.Qs.total <- get_total_Qs(STR.Qs.plus.up.list, STR.Qs.minus.list, STR.Qs.plus.down.list, STR.Qs.minus.down.list, STR.window_len)
ggplot(STR.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()

Z_DNA.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q1.bed.Z_DNA.list.out.num'
Z_DNA.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q2.bed.Z_DNA.list.out.num'
Z_DNA.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q3.bed.Z_DNA.list.out.num'
Z_DNA.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_plus.q4.bed.Z_DNA.list.out.num'
Z_DNA.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q1.bed.Z_DNA.list.out.num'
Z_DNA.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q2.bed.Z_DNA.list.out.num'
Z_DNA.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q3.bed.Z_DNA.list.out.num'
Z_DNA.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_plus.q4.bed.Z_DNA.list.out.num'
Z_DNA.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q1.bed.Z_DNA.list.out.num'
Z_DNA.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q2.bed.Z_DNA.list.out.num'
Z_DNA.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q3.bed.Z_DNA.list.out.num'
Z_DNA.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.up_minus.q4.bed.Z_DNA.list.out.num'
Z_DNA.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q1.bed.Z_DNA.list.out.num'
Z_DNA.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q2.bed.Z_DNA.list.out.num'
Z_DNA.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q3.bed.Z_DNA.list.out.num'
Z_DNA.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.Z_DNA.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/All_non_Bs/q1_q4/exon.down_minus.q4.bed.Z_DNA.list.out.num'
Z_DNA.Qs.plus.up.list <- list(Z_DNA.Q1_up_plus, Z_DNA.Q2_up_plus, Z_DNA.Q3_up_plus, Z_DNA.Q4_up_plus)
Z_DNA.Qs.minus.list <- list(Z_DNA.Q1_up_minus, Z_DNA.Q2_up_minus, Z_DNA.Q3_up_minus, Z_DNA.Q4_up_minus)
Z_DNA.Qs.plus.down.list <- list(Z_DNA.Q1_down_plus, Z_DNA.Q2_down_plus, Z_DNA.Q3_down_plus, Z_DNA.Q4_down_plus)
Z_DNA.Qs.minus.down.list <- list(Z_DNA.Q1_down_minus, Z_DNA.Q2_down_minus, Z_DNA.Q3_down_minus, Z_DNA.Q4_down_minus)
Z_DNA.window_len = 2000
Z_DNA.Qs.total <- get_total_Qs(Z_DNA.Qs.plus.up.list, Z_DNA.Qs.minus.list, Z_DNA.Qs.plus.down.list, Z_DNA.Qs.minus.down.list, Z_DNA.window_len)
ggplot(Z_DNA.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw()

G4.Qs.total[, Non_B:="G4"]
DR.Qs.total[, Non_B:="DR"]
H_DNA.Qs.total[, Non_B:="H-DNA"]
IR.Qs.total[, Non_B:="IR"]
MR.Qs.total[, Non_B:="MR"]
STR.Qs.total[, Non_B:="STR"]
Z_DNA.Qs.total[, Non_B:="Z-DNA"]
Non_B.Qs.TOTAL <- rbind(G4.Qs.total, DR.Qs.total, H_DNA.Qs.total, IR.Qs.total, MR.Qs.total, STR.Qs.total, Z_DNA.Qs.total)
Non_B.Qs.TOTAL$Q <- mapvalues(Non_B.Qs.TOTAL$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(Non_B.Qs.TOTAL)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-150,150)) +
  facet_grid( Non_B ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

Non_B.Qs.TOTAL.Enrrichment_Peak <- Non_B.Qs.TOTAL[  , .(Enrrichment_Peak=max(Enrrichment)) , by= c("Non_B", "exon_pos", "Q")]
write.table(Non_B.Qs.TOTAL.Enrrichment_Peak, file = "Non_B.Qs.TOTAL.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

Template - non template

To investigate if the distribution of non-B DNA motifs is biased by transcription direction, we generate .num files where the counts were separated by template and non templated strands:

G4.template.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q1.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q1.bed.G4s_minus_plus.list.final.num'
G4.template.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q2.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q2.bed.G4s_minus_plus.list.final.num'
G4.template.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q3.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q3.bed.G4s_minus_plus.list.final.num'
G4.template.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q4.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q4.bed.G4s_minus_plus.list.final.num'
G4.template.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q1.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q1.bed.G4s_plus_minus.list.final.num'
G4.template.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q2.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q2.bed.G4s_plus_minus.list.final.num'
G4.template.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q3.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q3.bed.G4s_plus_minus.list.final.num'
G4.template.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q4.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q4.bed.G4s_plus_minus.list.final.num'
G4.template.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q1.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q1.bed.G4s_minus_plus.list.final.num'
G4.template.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q2.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q2.bed.G4s_minus_plus.list.final.num'
G4.template.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q3.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q3.bed.G4s_minus_plus.list.final.num'
G4.template.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q4.bed.G4s_minus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q4.bed.G4s_minus_plus.list.final.num'
G4.template.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q1.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q1.bed.G4s_plus_minus.list.final.num'
G4.template.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q2.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q2.bed.G4s_plus_minus.list.final.num'
G4.template.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q3.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q3.bed.G4s_plus_minus.list.final.num'
G4.template.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q4.bed.G4s_plus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q4.bed.G4s_plus_minus.list.final.num'
G4.non_template.Q1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q1.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q1.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q2.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q2.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q3.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q3.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q4.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_plus.q4.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q1.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q1.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q2.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q2.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q3.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q3.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q4.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.up_minus.q4.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q1.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q1.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q2.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q2.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q3.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q3.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q4.bed.G4s_plus_plus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_plus.q4.bed.G4s_plus_plus.list.final.num'
G4.non_template.Q1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q1.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q1.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q2.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q2.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q3.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q3.bed.G4s_minus_minus.list.final.num'
G4.non_template.Q4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q4.bed.G4s_minus_minus.list.final.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/template_non_template/exon.down_minus.q4.bed.G4s_minus_minus.list.final.num'
G4.template.Qs.plus.up.list <- list(G4.template.Q1_up_plus, G4.template.Q2_up_plus, G4.template.Q3_up_plus, G4.template.Q4_up_plus)
G4.template.Qs.minus.list <- list(G4.template.Q1_up_minus, G4.template.Q2_up_minus, G4.template.Q3_up_minus, G4.template.Q4_up_minus)
G4.template.Qs.plus.down.list <- list(G4.template.Q1_down_plus, G4.template.Q2_down_plus, G4.template.Q3_down_plus, G4.template.Q4_down_plus)
G4.template.Qs.minus.down.list <- list(G4.template.Q1_down_minus, G4.template.Q2_down_minus, G4.template.Q3_down_minus, G4.template.Q4_down_minus)
G4.template.window_len = 2000
G4.template.Qs.total <- get_total_Qs(G4.template.Qs.plus.up.list, G4.template.Qs.minus.list, G4.template.Qs.plus.down.list, G4.template.Qs.minus.down.list, window_len)
G4.non_template.Qs.plus.up.list <- list(G4.non_template.Q1_up_plus, G4.non_template.Q2_up_plus, G4.non_template.Q3_up_plus, G4.non_template.Q4_up_plus)
G4.non_template.Qs.minus.list <- list(G4.non_template.Q1_up_minus, G4.non_template.Q2_up_minus, G4.non_template.Q3_up_minus, G4.non_template.Q4_up_minus)
G4.non_template.Qs.plus.down.list <- list(G4.non_template.Q1_down_plus, G4.non_template.Q2_down_plus, G4.non_template.Q3_down_plus, G4.non_template.Q4_down_plus)
G4.non_template.Qs.minus.down.list <- list(G4.non_template.Q1_down_minus, G4.non_template.Q2_down_minus, G4.non_template.Q3_down_minus, G4.non_template.Q4_down_minus)
G4.non_template.window_len = 2000
G4.non_template.Qs.total <- get_total_Qs(G4.non_template.Qs.plus.up.list, G4.non_template.Qs.minus.list, G4.non_template.Qs.plus.down.list, G4.non_template.Qs.minus.down.list, window_len)
G4.template.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1           147      179     0.8212291           152      175     0.8685714         299    351   0.8518519   Upstream
    2:    -1000 2           126      134     0.9402985           141      135     1.0444444         267    268   0.9962687   Upstream
    3:    -1000 3           100       99     1.0101010            94       94     1.0000000         194    192   1.0104167   Upstream
    4:    -1000 4            63       66     0.9545455            74       65     1.1384615         137    131   1.0458015   Upstream
    5:     -999 1           149      179     0.8324022           150      175     0.8571429         299    351   0.8518519   Upstream
   ---                                                                                                                               
15988:      997 4            99      108     0.9166667           104      104     1.0000000         203    211   0.9620853 Downstream
15989:      998 1           119      137     0.8686131           111      129     0.8604651         230    266   0.8646617 Downstream
15990:      998 2           109      128     0.8515625           117      127     0.9212598         226    252   0.8968254 Downstream
15991:      998 3           106      110     0.9636364           109      109     1.0000000         215    217   0.9907834 Downstream
15992:      998 4            96      108     0.8888889           104      104     1.0000000         200    211   0.9478673 Downstream
G4.non_template.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1           193      202     0.9554455           174      200     0.8700000         367    406   0.9039409   Upstream
    2:    -1000 2           148      161     0.9192547           120      149     0.8053691         268    309   0.8673139   Upstream
    3:    -1000 3           124      122     1.0163934           113      108     1.0462963         237    229   1.0349345   Upstream
    4:    -1000 4            84       74     1.1351351            70       70     1.0000000         154    144   1.0694444   Upstream
    5:     -999 1           193      202     0.9554455           177      200     0.8850000         370    406   0.9113300   Upstream
   ---                                                                                                                               
15988:      997 4           102      114     0.8947368            99      109     0.9082569         201    225   0.8933333 Downstream
15989:      998 1           123      154     0.7987013           128      136     0.9411765         251    289   0.8685121 Downstream
15990:      998 2           128      147     0.8707483           114      139     0.8201439         242    288   0.8402778 Downstream
15991:      998 3           108      125     0.8640000            90      122     0.7377049         198    249   0.7951807 Downstream
15992:      998 4            98      114     0.8596491            99      109     0.9082569         197    225   0.8755556 Downstream
G4.template_non_template.Qs.total <- rbind(G4.template.Qs.total, G4.non_template.Qs.total)
  
half_n <- nrow(G4.template_non_template.Qs.total)/2
G4.template_non_template.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
  
  
  
  
G4.template_non_template.Qs.total$Strand <-  factor(G4.template_non_template.Qs.total$Strand, levels=c("Template", "Non-template" ))
  
G4.template_non_template.Qs.total$Q <- mapvalues(G4.template_non_template.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4.template_non_template.Qs.total.binomial <- cbind(G4.template_non_template.Qs.total,  G4.template_non_template.Qs.total[, binconf(Occurrences, hg19.nexons/8) ])
G4.template_non_template.Qs.total.binomial[, median:=NULL]
G4.template_non_template.Qs.total.binomial[ , median:=median(PointEst), by=c("exon_pos", "Q", "Strand")]
G4.template_non_template.Qs.total.binomial[, `:=`(Enrrichment=PointEst/median, Enrrichment_l=Lower/median, Enrrichment_u=Upper/median)]
Fig2.A <- ggplot(G4.template_non_template.Qs.total.binomial)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
   geom_ribbon(aes(x=Position, fill=Q, ymin=Enrrichment_l, ymax=Enrrichment_u), alpha=0.3) +
  xlim(c(-150,150)) +
  facet_grid( Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")
Fig2.A

G4.template_non_template.total <- G4.template_non_template.Qs.total[ , .(Occurrences=sum(Occurrences)) , by=c("Strand", "exon_pos", "Position")]
G4.template_non_template.total[ , median:=median(Occurrences) , by=c("Strand", "exon_pos")]
G4.template_non_template.total[ , Enrrichment:=Occurrences/median , by=c("Strand", "exon_pos", "Position")]
ggplot(G4.template_non_template.total)+
  geom_line(aes(x=Position,y=Enrrichment)) +
  xlim(c(-150,150)) +
  facet_grid( Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

G4.template_non_template.total_Peak <- G4.template_non_template.total[  , .(Enrrichment_Peak=max(Enrrichment)) , by= c("Strand", "exon_pos")]
write.table(G4.template_non_template.total_Peak, file = "G4.template_non_template.total_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")
G4.template_non_template.Qs.total.Enrrichment_Peak <- G4.template_non_template.Qs.total[  , .(Enrrichment_Peak=max(Enrrichment)) , by= c( "exon_pos", "Q", "Strand" )]
write.table(G4.template_non_template.Qs.total.Enrrichment_Peak, file = "G4.template_non_template.Qs.total.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

G4 RUNS

Here we explored the enrichment of G-quadruplexes with different G-run length


G1_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Single_G_runs.list.out.num")
G2_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Twice_G_runs.list.out.num")
G3_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Three_G_runs.list.out.num")
G4_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Four_G_runs.list.out.num")
G5_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Five_G_runs.list.out.num")
G6_up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_plus.bed.Six_G_runs.list.out.num")

G1_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Single_G_runs.list.out.num")
G2_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Twice_G_runs.list.out.num")
G3_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Three_G_runs.list.out.num")
G4_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Four_G_runs.list.out.num")
G5_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Five_G_runs.list.out.num")
G6_up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.up_minus.bed.Six_G_runs.list.out.num")

G1_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Single_G_runs.list.out.num")
G2_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Twice_G_runs.list.out.num")
G3_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Three_G_runs.list.out.num")
G4_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Four_G_runs.list.out.num")
G5_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Five_G_runs.list.out.num")
G6_down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_plus.bed.Six_G_runs.list.out.num")

G1_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Single_G_runs.list.out.num")
G2_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Twice_G_runs.list.out.num")
G3_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Three_G_runs.list.out.num")
G4_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Four_G_runs.list.out.num")  #missing
G5_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Five_G_runs.list.out.num")
G6_down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/G4_runs/exon.down_minus.bed.Six_G_runs.list.out.num")
Gruns.up_plus.list <- list(G1_up_plus, G2_up_plus, G3_up_plus, G4_up_plus, G5_up_plus, G6_up_plus)
Gruns.up_minus.list <- list(G1_up_minus, G2_up_minus, G3_up_minus, G4_up_minus, G5_up_minus, G6_up_minus)
Gruns.down_plus.list <- list(G1_down_plus, G2_down_plus, G3_down_plus, G4_down_plus, G5_down_plus, G6_down_plus)
Gruns.down_minus.list <- list(G1_down_minus, G2_down_minus, G3_down_minus, G4_down_minus, G5_down_minus, G6_down_minus)
Gruns.window_len = 2000
Gruns.total <- get_total_Qs(Gruns.up_plus.list, Gruns.up_minus.list, Gruns.down_plus.list, Gruns.down_minus.list, Gruns.window_len)
Gruns.total[, G_run_length:=Q]
Fig2.B
Error in FUN(X[[i]], ...) : object 'Enrrichment_l' not found

Gruns.total.Enrrichment_Peak <- Gruns.total[  , .(Enrrichment_Peak=max(Enrrichment)) , by= c( "exon_pos", "G_run_length")]
write.table(Gruns.total.Enrrichment_Peak, file = "Gruns.total.Enrrichment_Peak.txt", append = FALSE, quote = FALSE, sep = "\t",
            eol = "\n", na = "NA", dec = ".", row.names = FALSE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

G4 enrichment across evolution

We analyzed the G4 enrichment across splice sites from different species

susScr11.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.up_plus.bed.score.susScr11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.up_plus.bed.score.susScr11.txt..list.out.num'
susScr11.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.down_plus.bed.score.susScr11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.down_plus.bed.score.susScr11.txt..list.out.num'
susScr11.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.up_minus.bed.score.susScr11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.up_minus.bed.score.susScr11.txt..list.out.num'
susScr11.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.down_minus.bed.score.susScr11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/susScr11.exon.down_minus.bed.score.susScr11.txt..list.out.num'
susScr11.up_minus[,Position:=Position*-1]
susScr11.down_minus[,Position:=Position*-1]
susScr11.TOTAL <- plot_density(susScr11.up_plus, susScr11.up_minus, susScr11.down_plus, susScr11.down_minus)

TAIR10.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.up_plus.bed.score.TAIR10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.up_plus.bed.score.TAIR10.txt..list.out.num'
TAIR10.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.down_plus.bed.score.TAIR10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.down_plus.bed.score.TAIR10.txt..list.out.num'
TAIR10.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.up_minus.bed.score.TAIR10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.up_minus.bed.score.TAIR10.txt..list.out.num'
TAIR10.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.down_minus.bed.score.TAIR10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/TAIR10.exon.down_minus.bed.score.TAIR10.txt..list.out.num'
TAIR10.up_minus[,Position:=Position*-1]
TAIR10.down_minus[,Position:=Position*-1]
TAIR10.TOTAL <- plot_density(TAIR10.up_plus, TAIR10.up_minus, TAIR10.down_plus, TAIR10.down_minus)

anoCar2.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.up_plus.bed.score.anoCar2.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.up_plus.bed.score.anoCar2.txt..list.out.num'
anoCar2.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.down_plus.bed.score.anoCar2.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.down_plus.bed.score.anoCar2.txt..list.out.num'
anoCar2.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.up_minus.bed.score.anoCar2.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.up_minus.bed.score.anoCar2.txt..list.out.num'
anoCar2.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.down_minus.bed.score.anoCar2.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/anoCar2.exon.down_minus.bed.score.anoCar2.txt..list.out.num'
anoCar2.up_minus[,Position:=Position*-1]
anoCar2.down_minus[,Position:=Position*-1]
anoCar2.TOTAL <- plot_density(anoCar2.up_plus, anoCar2.up_minus, anoCar2.down_plus, anoCar2.down_minus)

xenTro9.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.up_plus.bed.score.xenTro9.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.up_plus.bed.score.xenTro9.txt..list.out.num'
xenTro9.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.down_plus.bed.score.xenTro9.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.down_plus.bed.score.xenTro9.txt..list.out.num'
xenTro9.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.up_minus.bed.score.xenTro9.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.up_minus.bed.score.xenTro9.txt..list.out.num'
xenTro9.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.down_minus.bed.score.xenTro9.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/xenTro9.exon.down_minus.bed.score.xenTro9.txt..list.out.num'
xenTro9.up_minus[,Position:=Position*-1]
xenTro9.down_minus[,Position:=Position*-1]
xenTro9.TOTAL <- plot_density(xenTro9.up_plus, xenTro9.up_minus, xenTro9.down_plus, xenTro9.down_minus)

ce10.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.up_plus.bed.score.ce10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.up_plus.bed.score.ce10.txt..list.out.num'
ce10.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.down_plus.bed.score.ce10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.down_plus.bed.score.ce10.txt..list.out.num'
ce10.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.up_minus.bed.score.ce10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.up_minus.bed.score.ce10.txt..list.out.num'
ce10.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.down_minus.bed.score.ce10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/ce10.exon.down_minus.bed.score.ce10.txt..list.out.num'
ce10.up_minus[,Position:=Position*-1]
ce10.down_minus[,Position:=Position*-1]
ce10.TOTAL <- plot_density(ce10.up_plus, ce10.up_minus, ce10.down_plus, ce10.down_minus)

danRer11.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.up_plus.bed.score.danRer11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.up_plus.bed.score.danRer11.txt..list.out.num'
danRer11.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.down_plus.bed.score.danRer11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.down_plus.bed.score.danRer11.txt..list.out.num'
danRer11.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.up_minus.bed.score.danRer11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.up_minus.bed.score.danRer11.txt..list.out.num'
danRer11.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.down_minus.bed.score.danRer11.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/danRer11.exon.down_minus.bed.score.danRer11.txt..list.out.num'
danRer11.up_minus[,Position:=Position*-1]
danRer11.down_minus[,Position:=Position*-1]
danRer11.TOTAL <- plot_density(danRer11.up_plus, danRer11.up_minus, danRer11.down_plus, danRer11.down_minus)

mm10.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.up_plus.bed.score.mm10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.up_plus.bed.score.mm10.txt..list.out.num'
mm10.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.down_plus.bed.score.mm10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.down_plus.bed.score.mm10.txt..list.out.num'
mm10.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.up_minus.bed.score.mm10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.up_minus.bed.score.mm10.txt..list.out.num'
mm10.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.down_minus.bed.score.mm10.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/mm10.exon.down_minus.bed.score.mm10.txt..list.out.num'
mm10.up_minus[,Position:=Position*-1]
mm10.down_minus[,Position:=Position*-1]
mm10.TOTAL <- plot_density(mm10.up_plus, mm10.up_minus, mm10.down_plus, mm10.down_minus)

hg19.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.up_plus.bed.score.hg19.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.up_plus.bed.score.hg19.txt..list.out.num'
hg19.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.down_plus.bed.score.hg19.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.down_plus.bed.score.hg19.txt..list.out.num'
hg19.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.up_minus.bed.score.hg19.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.up_minus.bed.score.hg19.txt..list.out.num'
hg19.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.down_minus.bed.score.hg19.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/hg19.exon.down_minus.bed.score.hg19.txt..list.out.num'
hg19.up_minus[,Position:=Position*-1]
hg19.down_minus[,Position:=Position*-1]
hg19.TOTAL <- plot_density(hg19.up_plus, hg19.up_minus, hg19.down_plus, hg19.down_minus)

dm6.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.up_plus.bed.score.dm6.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.up_plus.bed.score.dm6.txt..list.out.num'
dm6.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.down_plus.bed.score.dm6.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.down_plus.bed.score.dm6.txt..list.out.num'
dm6.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.up_minus.bed.score.dm6.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.up_minus.bed.score.dm6.txt..list.out.num'
dm6.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.down_minus.bed.score.dm6.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/dm6.exon.down_minus.bed.score.dm6.txt..list.out.num'
dm6.up_minus[,Position:=Position*-1]
dm6.down_minus[,Position:=Position*-1]
dm6.TOTAL <- plot_density(dm6.up_plus, dm6.up_minus, dm6.down_plus, dm6.down_minus)

galGal5.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.up_plus.bed.score.galGal5.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.up_plus.bed.score.galGal5.txt..list.out.num'
galGal5.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.down_plus.bed.score.galGal5.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.down_plus.bed.score.galGal5.txt..list.out.num'
galGal5.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.up_minus.bed.score.galGal5.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.up_minus.bed.score.galGal5.txt..list.out.num'
galGal5.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.down_minus.bed.score.galGal5.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/galGal5.exon.down_minus.bed.score.galGal5.txt..list.out.num'
galGal5.up_minus[,Position:=Position*-1]
galGal5.down_minus[,Position:=Position*-1]
galGal5.TOTAL <- plot_density(galGal5.up_plus, galGal5.up_minus, galGal5.down_plus, galGal5.down_minus)

sacCer.up_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.up_plus.bed.score.sacCer3.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.up_plus.bed.score.sacCer3.txt..list.out.num'
sacCer.down_plus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.down_plus.bed.score.sacCer3.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.down_plus.bed.score.sacCer3.txt..list.out.num'
sacCer.up_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.up_minus.bed.score.sacCer3.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.up_minus.bed.score.sacCer3.txt..list.out.num'
sacCer.down_minus <- read_dist_table("~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.down_minus.bed.score.sacCer3.txt..list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/Evolution/Num/sacCer3.exon.down_minus.bed.score.sacCer3.txt..list.out.num'
sacCer.up_minus[,Position:=Position*-1]
sacCer.down_minus[,Position:=Position*-1]
sacCer.TOTAL <- plot_density(sacCer.up_plus, sacCer.up_minus, sacCer.down_plus, sacCer.down_minus)

galGal5.up_plus[, rep(Position, Occurrences)]
   [1] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
  [32] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
  [63] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
  [94] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [125] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [156] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [187] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [218] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [249] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [280] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [311] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [342] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [373] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [404] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [435] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [466] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [497] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [528] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [559] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [590] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [621] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [652] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [683] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000
 [714] -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000 -1000  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [745]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [776]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [807]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [838]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [869]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [900]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [931]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [962]  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999  -999
 [993]  -999  -999  -999  -999  -999  -999  -999  -999
 [ reached getOption("max.print") -- omitted 1276779 entries ]
galGal5.up <- merge(galGal5.down_plus, galGal5.down_minus, by="Position")
galGal5.up[, Occurrences:= Occurrences.x + Occurrences.y]
galGal5.up.melt <- galGal5.up[, rep(Position, Occurrences)]
galGal5.up.melt <- data.table(cbind(galGal5.up.melt, "Up"))
colnames(galGal5.up.melt) <- c("dist", "pos")
galGal5.up.melt$dist <- as.numeric(as.character(galGal5.up.melt$dist))
ggplot(galGal5.up.melt) + 
  geom_line(aes(dist), stat="density")

All.species.TOTAL <- rbind(ce10.TOTAL, dm6.TOTAL, TAIR10.TOTAL  )
ggplot(All.species.TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment, color=species)) +
    xlim(c(-300,300)) +
    ggtitle( "Non-vertebrates") +
    facet_grid( . ~ exon_pos ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme_bw()

G4 and gene structure

Flanking intron size

Here we analized the intron size of distribution of exon which are flanked by G4 (on an 100nt window)

intron_size_upstream_non_template  <- rbind(fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_upstream_100nt_window.bed.plus_strand_genome.plus_G4s'),  
 fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_upstream_100nt_window.bed.minus_strand_genome.minus_G4s'))
intron_size_downstream_non_template  <- rbind(fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_downstream_100nt_window.bed.plus_strand_genome.plus_G4s'),  
 fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_downstream_100nt_window.bed.minus_strand_genome.minus_G4s'))
intron_size_upstream_template  <- rbind(fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_upstream_100nt_window.bed.plus_strand_genome.minus_G4s'),  
 fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_upstream_100nt_window.bed.minus_strand_genome.plus_G4s'))
intron_size_downstream_template  <- rbind(fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_downstream_100nt_window.bed.minus_strand_genome.plus_G4s'),  
 fread('/Users/gp7/Google_Drive/Results/Non_B/Intron_size/Introns.hg19_downstream_100nt_window.bed.plus_strand_genome.minus_G4s'))
intron_size_upstream_non_template[ , `:=`(exon_pos="upstream", strand="non_template") ]
intron_size_downstream_non_template[ , `:=`(exon_pos="downstream", strand="non_template") ]
intron_size_upstream_template[ , `:=`(exon_pos="upstream", strand="template") ]
intron_size_downstream_template[ , `:=`(exon_pos="downstream", strand="template") ]
intron_size_TOTAL <- rbind(intron_size_upstream_non_template, intron_size_downstream_non_template, intron_size_upstream_template, intron_size_downstream_template )
colnames(intron_size_TOTAL) <- c("chrom", "start", "end", "strand", "intron_number", "intron_size", "Transcript", "G4", "exon_pos", "Strand"  )

Exon number

Here we explored how G4 enrichments change thorugh gene body

exons_1.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_1.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_1.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_1.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                               file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_1_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_1.up_minus[,Position:=Position*-1]
exons_1.down_minus[,Position:=Position*-1]
exons_1.TOTAL <- plot_density(exons_1.up_plus, exons_1.up_minus, exons_1.down_plus, exons_1.down_minus) 

exons_2.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_2.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_2.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_2.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                               file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_2_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_2.up_minus[,Position:=Position*-1]
exons_2.down_minus[,Position:=Position*-1]
exons_2.TOTAL <- plot_density(exons_2.up_plus, exons_2.up_minus, exons_2.down_plus, exons_2.down_minus) 

exons_3.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_3.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_3.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_3.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                               file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_3_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_3.up_minus[,Position:=Position*-1]
exons_3.down_minus[,Position:=Position*-1]
exons_3.TOTAL <- plot_density(exons_3.up_plus, exons_3.up_minus, exons_3.down_plus, exons_3.down_minus) 

exons_4.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_4.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_4.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_4.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                               file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_4_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_4.up_minus[,Position:=Position*-1]
exons_4.down_minus[,Position:=Position*-1]
exons_4.TOTAL <- plot_density(exons_4.up_plus, exons_4.up_minus, exons_4.down_plus, exons_4.down_minus) 

exons_middle.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_middle.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_middle.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_middle.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_middle_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_middle.up_minus[,Position:=Position*-1]
exons_middle.down_minus[,Position:=Position*-1]
exons_middle.TOTAL <- plot_density(exons_middle.up_plus, exons_middle.up_minus, exons_middle.down_plus, exons_middle.down_minus) 

exons_minus4.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus4.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus4.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus4.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus4_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus4.up_minus[,Position:=Position*-1]
exons_minus4.down_minus[,Position:=Position*-1]
exons_minus4.TOTAL <- plot_density(exons_minus4.up_plus, exons_minus4.up_minus, exons_minus4.down_plus, exons_minus4.down_minus) 

exons_minus3.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus3.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus3.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus3.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus3_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus3.up_minus[,Position:=Position*-1]
exons_minus3.down_minus[,Position:=Position*-1]
exons_minus3.TOTAL <- plot_density(exons_minus3.up_plus, exons_minus3.up_minus, exons_minus3.down_plus, exons_minus3.down_minus) 

exons_minus2.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus2.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus2.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus2.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus2_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus2.up_minus[,Position:=Position*-1]
exons_minus2.down_minus[,Position:=Position*-1]
exons_minus2.TOTAL <- plot_density(exons_minus2.up_plus, exons_minus2.up_minus, exons_minus2.down_plus, exons_minus2.down_minus) 

exons_minus1.up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_plus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_plus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus1.down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_plus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_plus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus1.up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_minus_strand_upstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_minus_strand_upstream.txt.score.G4.bed.list.out.num'
exons_minus1.down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_minus_strand_downstream.txt.score.G4.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/exon_numbers/exons_minus1_minus_strand_downstream.txt.score.G4.bed.list.out.num'
exons_minus1.up_minus[,Position:=Position*-1]
exons_minus1.down_minus[,Position:=Position*-1]
exons_minus1.TOTAL <- plot_density(exons_minus1.up_plus, exons_minus1.up_minus, exons_minus1.down_plus, exons_minus1.down_minus) 

exons_1.TOTAL[, exon_num:="1"]
exons_2.TOTAL[, exon_num:="2"]
exons_3.TOTAL[, exon_num:="3"]
exons_4.TOTAL[, exon_num:="4"]
exons_middle.TOTAL[, exon_num:="middle"]
exons_minus4.TOTAL[, exon_num:="-4"]
exons_minus3.TOTAL[, exon_num:="-3"]
exons_minus2.TOTAL[, exon_num:="-2"]
exons_minus1.TOTAL[, exon_num:="-1"]
exon_num.TOTAL <- rbind(exons_1.TOTAL, exons_2.TOTAL, exons_3.TOTAL, exons_4.TOTAL, exons_middle.TOTAL, exons_minus4.TOTAL, exons_minus3.TOTAL, exons_minus2.TOTAL, exons_minus1.TOTAL)
exon_num.TOTAL$exon_num <- factor(exon_num.TOTAL$exon_num, levels = c("1", "2", "3", "4", "middle", "-4", "-3", "-2", "-1" ))
ggplot(exon_num.TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment)) +
    xlim(c(-300,300)) +
    facet_grid( exon_pos ~ exon_num   ) +
  theme_bw()

G4 seq

Here we distribution of G4-seq experiments

G4_2019.K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.K.Qs.plus.up.list <- list(G4_2019.K.Q1_up_plus, G4_2019.K.Q2_up_plus, G4_2019.K.Q3_up_plus, G4_2019.K.Q4_up_plus)
G4_2019.K.Qs.minus.list <- list(G4_2019.K.Q1_up_minus, G4_2019.K.Q2_up_minus, G4_2019.K.Q3_up_minus, G4_2019.K.Q4_up_minus)
G4_2019.K.Qs.plus.down.list <- list(G4_2019.K.Q1_down_plus, G4_2019.K.Q2_down_plus, G4_2019.K.Q3_down_plus, G4_2019.K.Q4_down_plus)
G4_2019.K.Qs.minus.down.list <- list(G4_2019.K.Q1_down_minus, G4_2019.K.Q2_down_minus, G4_2019.K.Q3_down_minus, G4_2019.K.Q4_down_minus)
G4_2019.K.window_len = 2000
G4_2019.K.Qs.total <- get_total_Qs(G4_2019.K.Qs.plus.up.list, G4_2019.K.Qs.minus.list, G4_2019.K.Qs.plus.down.list, G4_2019.K.Qs.minus.down.list, G4_2019.K.window_len)
ggplot(G4_2019.K.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw() + 
  labs(colour = "Splice site stregth quartile") +
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.PDS.Qs.plus.up.list <- list(G4_2019.PDS.Q1_up_plus, G4_2019.PDS.Q2_up_plus, G4_2019.PDS.Q3_up_plus, G4_2019.PDS.Q4_up_plus)
G4_2019.PDS.Qs.minus.list <- list(G4_2019.PDS.Q1_up_minus, G4_2019.PDS.Q2_up_minus, G4_2019.PDS.Q3_up_minus, G4_2019.PDS.Q4_up_minus)
G4_2019.PDS.Qs.plus.down.list <- list(G4_2019.PDS.Q1_down_plus, G4_2019.PDS.Q2_down_plus, G4_2019.PDS.Q3_down_plus, G4_2019.PDS.Q4_down_plus)
G4_2019.PDS.Qs.minus.down.list <- list(G4_2019.PDS.Q1_down_minus, G4_2019.PDS.Q2_down_minus, G4_2019.PDS.Q3_down_minus, G4_2019.PDS.Q4_down_minus)
G4_2019.PDS.window_len = 2000
G4_2019.PDS.Qs.total <- get_total_Qs(G4_2019.PDS.Qs.plus.up.list, G4_2019.PDS.Qs.minus.list, G4_2019.PDS.Qs.plus.down.list, G4_2019.PDS.Qs.minus.down.list, G4_2019.PDS.window_len)
ggplot(G4_2019.PDS.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw() + 
  labs(colour = "Splice site stregth quartile") +
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.non_template.PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.bed.list.out.num'
G4_2019.template.PDS.Qs.plus.up.list <- list(G4_2019.template.PDS.Q1_up_plus, G4_2019.template.PDS.Q2_up_plus, G4_2019.template.PDS.Q3_up_plus, G4_2019.template.PDS.Q4_up_plus)
G4_2019.template.PDS.Qs.minus.list <- list(G4_2019.template.PDS.Q1_up_minus, G4_2019.template.PDS.Q2_up_minus, G4_2019.template.PDS.Q3_up_minus, G4_2019.template.PDS.Q4_up_minus)
G4_2019.template.PDS.Qs.plus.down.list <- list(G4_2019.template.PDS.Q1_down_plus, G4_2019.template.PDS.Q2_down_plus, G4_2019.template.PDS.Q3_down_plus, G4_2019.template.PDS.Q4_down_plus)
G4_2019.template.PDS.Qs.minus.down.list <- list(G4_2019.template.PDS.Q1_down_minus, G4_2019.template.PDS.Q2_down_minus, G4_2019.template.PDS.Q3_down_minus, G4_2019.template.PDS.Q4_down_minus)
G4_2019.template.PDS.window_len = 2000
G4_2019.template.PDS.Qs.total <- get_total_Qs(G4_2019.template.PDS.Qs.plus.up.list, G4_2019.template.PDS.Qs.minus.list, G4_2019.template.PDS.Qs.plus.down.list, G4_2019.template.PDS.Qs.minus.down.list, window_len)
G4_2019.non_template.PDS.Qs.plus.up.list <- list(G4_2019.non_template.PDS.Q1_up_plus, G4_2019.non_template.PDS.Q2_up_plus, G4_2019.non_template.PDS.Q3_up_plus, G4_2019.non_template.PDS.Q4_up_plus)
G4_2019.non_template.PDS.Qs.minus.list <- list(G4_2019.non_template.PDS.Q1_up_minus, G4_2019.non_template.PDS.Q2_up_minus, G4_2019.non_template.PDS.Q3_up_minus, G4_2019.non_template.PDS.Q4_up_minus)
G4_2019.non_template.PDS.Qs.plus.down.list <- list(G4_2019.non_template.PDS.Q1_down_plus, G4_2019.non_template.PDS.Q2_down_plus, G4_2019.non_template.PDS.Q3_down_plus, G4_2019.non_template.PDS.Q4_down_plus)
G4_2019.non_template.PDS.Qs.minus.down.list <- list(G4_2019.non_template.PDS.Q1_down_minus, G4_2019.non_template.PDS.Q2_down_minus, G4_2019.non_template.PDS.Q3_down_minus, G4_2019.non_template.PDS.Q4_down_minus)
G4_2019.non_template.PDS.window_len = 2000
G4_2019.non_template.PDS.Qs.total <- get_total_Qs(G4_2019.non_template.PDS.Qs.plus.up.list, G4_2019.non_template.PDS.Qs.minus.list, G4_2019.non_template.PDS.Qs.plus.down.list, G4_2019.non_template.PDS.Qs.minus.down.list, window_len)
G4_2019.template_non_template.PDS.Qs.total <- rbind(G4_2019.template.PDS.Qs.total, G4_2019.non_template.PDS.Qs.total)
  
half_n <- nrow(G4_2019.template_non_template.PDS.Qs.total)/2
G4_2019.template_non_template.PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
  
  
  
  
G4_2019.template_non_template.PDS.Qs.total$Strand <-  factor(G4_2019.template_non_template.PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
  
G4_2019.template_non_template.PDS.Qs.total$Q <- mapvalues(G4_2019.template_non_template.PDS.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-150,150)) +
  facet_grid( Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template_non_template.PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
  
G4_2019.template_non_template.PDS.Qs.total$new_Strand <-  factor(G4_2019.template_non_template.PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.PDS.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-150,150)) +
  facet_grid( new_Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2019.template.K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.up_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_plus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q1.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q2.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q3.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.non_template.K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2019/exon.down_minus.q4.bed.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.bed.list.out.num'
G4_2019.template.K.Qs.plus.up.list <- list(G4_2019.template.K.Q1_up_plus, G4_2019.template.K.Q2_up_plus, G4_2019.template.K.Q3_up_plus, G4_2019.template.K.Q4_up_plus)
G4_2019.template.K.Qs.minus.list <- list(G4_2019.template.K.Q1_up_minus, G4_2019.template.K.Q2_up_minus, G4_2019.template.K.Q3_up_minus, G4_2019.template.K.Q4_up_minus)
G4_2019.template.K.Qs.plus.down.list <- list(G4_2019.template.K.Q1_down_plus, G4_2019.template.K.Q2_down_plus, G4_2019.template.K.Q3_down_plus, G4_2019.template.K.Q4_down_plus)
G4_2019.template.K.Qs.minus.down.list <- list(G4_2019.template.K.Q1_down_minus, G4_2019.template.K.Q2_down_minus, G4_2019.template.K.Q3_down_minus, G4_2019.template.K.Q4_down_minus)
G4_2019.template.K.window_len = 2000
G4_2019.template.K.Qs.total <- get_total_Qs(G4_2019.template.K.Qs.plus.up.list, G4_2019.template.K.Qs.minus.list, G4_2019.template.K.Qs.plus.down.list, G4_2019.template.K.Qs.minus.down.list, window_len)
G4_2019.non_template.K.Qs.plus.up.list <- list(G4_2019.non_template.K.Q1_up_plus, G4_2019.non_template.K.Q2_up_plus, G4_2019.non_template.K.Q3_up_plus, G4_2019.non_template.K.Q4_up_plus)
G4_2019.non_template.K.Qs.minus.list <- list(G4_2019.non_template.K.Q1_up_minus, G4_2019.non_template.K.Q2_up_minus, G4_2019.non_template.K.Q3_up_minus, G4_2019.non_template.K.Q4_up_minus)
G4_2019.non_template.K.Qs.plus.down.list <- list(G4_2019.non_template.K.Q1_down_plus, G4_2019.non_template.K.Q2_down_plus, G4_2019.non_template.K.Q3_down_plus, G4_2019.non_template.K.Q4_down_plus)
G4_2019.non_template.K.Qs.minus.down.list <- list(G4_2019.non_template.K.Q1_down_minus, G4_2019.non_template.K.Q2_down_minus, G4_2019.non_template.K.Q3_down_minus, G4_2019.non_template.K.Q4_down_minus)
G4_2019.non_template.K.window_len = 2000
G4_2019.non_template.K.Qs.total <- get_total_Qs(G4_2019.non_template.K.Qs.plus.up.list, G4_2019.non_template.K.Qs.minus.list, G4_2019.non_template.K.Qs.plus.down.list, G4_2019.non_template.K.Qs.minus.down.list, window_len)
G4_2019.template.K.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1           825    903.0     0.9136213           840      854     0.9836066        1665   1741   0.9563469   Upstream
    2:    -1000 2           673    716.0     0.9399441           638      684     0.9327485        1311   1408   0.9311080   Upstream
    3:    -1000 3           555    567.0     0.9788360           592      546     1.0842491        1147   1116   1.0277778   Upstream
    4:    -1000 4           413    370.0     1.1162162           364      370     0.9837838         777    749   1.0373832   Upstream
    5:     -999 1           833    903.0     0.9224806           845      854     0.9894614        1678   1741   0.9638139   Upstream
   ---                                                                                                                               
15988:      997 4           480    540.0     0.8888889           474      540     0.8777778         954   1093   0.8728271 Downstream
15989:      998 1           579    698.0     0.8295129           561      640     0.8765625        1140   1347   0.8463252 Downstream
15990:      998 2           560    680.0     0.8235294           527      657     0.8021309        1087   1334   0.8148426 Downstream
15991:      998 3           504    590.5     0.8535140           472      595     0.7932773         976   1192   0.8187919 Downstream
15992:      998 4           484    540.0     0.8962963           474      540     0.8777778         958   1093   0.8764867 Downstream
G4_2019.non_template.K.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1           682      749     0.9105474           697      726     0.9600551        1379   1471   0.9374575   Upstream
    2:    -1000 2           564      618     0.9126214           573      594     0.9646465        1137   1212   0.9381188   Upstream
    3:    -1000 3           455      469     0.9701493           455      450     1.0111111         910    920   0.9891304   Upstream
    4:    -1000 4           339      341     0.9941349           345      324     1.0648148         684    665   1.0285714   Upstream
    5:     -999 1           685      749     0.9145527           695      726     0.9573003        1380   1471   0.9381373   Upstream
   ---                                                                                                                               
15988:      997 4           475      505     0.9405941           453      471     0.9617834         928    969   0.9576883 Downstream
15989:      998 1           614      600     1.0233333           494      558     0.8853047        1108   1151   0.9626412 Downstream
15990:      998 2           553      567     0.9753086           542      548     0.9890511        1095   1113   0.9838275 Downstream
15991:      998 3           530      523     1.0133843           461      494     0.9331984         991   1014   0.9773176 Downstream
15992:      998 4           474      505     0.9386139           456      471     0.9681529         930    969   0.9597523 Downstream
G4_2019.template_non_template.K.Qs.total <- rbind(G4_2019.template.K.Qs.total, G4_2019.non_template.K.Qs.total)
  
half_n <- nrow(G4_2019.template_non_template.K.Qs.total)/2
G4_2019.template_non_template.K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
  
  
  
  
G4_2019.template_non_template.K.Qs.total$Strand <-  factor(G4_2019.template_non_template.K.Qs.total$Strand, levels=c("Template", "Non-template" ))
  
G4_2019.template_non_template.K.Qs.total$Q <- mapvalues(G4_2019.template_non_template.K.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2019.template_non_template.K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2019.template_non_template.K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2019.template_non_template.K.Qs.total$new_Strand <-  factor(G4_2019.template_non_template.K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2019.template_non_template.K.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-150,150)) +
  facet_grid( new_Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

#2015
G4_2015.Na_PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_PDS.Qs.plus.up.list <- list(G4_2015.Na_PDS.Q1_up_plus, G4_2015.Na_PDS.Q2_up_plus, G4_2015.Na_PDS.Q3_up_plus, G4_2015.Na_PDS.Q4_up_plus)
G4_2015.Na_PDS.Qs.minus.list <- list(G4_2015.Na_PDS.Q1_up_minus, G4_2015.Na_PDS.Q2_up_minus, G4_2015.Na_PDS.Q3_up_minus, G4_2015.Na_PDS.Q4_up_minus)
G4_2015.Na_PDS.Qs.plus.down.list <- list(G4_2015.Na_PDS.Q1_down_plus, G4_2015.Na_PDS.Q2_down_plus, G4_2015.Na_PDS.Q3_down_plus, G4_2015.Na_PDS.Q4_down_plus)
G4_2015.Na_PDS.Qs.minus.down.list <- list(G4_2015.Na_PDS.Q1_down_minus, G4_2015.Na_PDS.Q2_down_minus, G4_2015.Na_PDS.Q3_down_minus, G4_2015.Na_PDS.Q4_down_minus)
G4_2015.Na_PDS.window_len = 2000
G4_2015.Na_PDS.Qs.total <- get_total_Qs(G4_2015.Na_PDS.Qs.plus.up.list, G4_2015.Na_PDS.Qs.minus.list, G4_2015.Na_PDS.Qs.plus.down.list, G4_2015.Na_PDS.Qs.minus.down.list, G4_2015.Na_PDS.window_len)
ggplot(G4_2015.Na_PDS.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw() + 
  labs(colour = "Splice site stregth quartile") +
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.Na_K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                        file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                         file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.Na_K.Qs.plus.up.list <- list(G4_2015.Na_K.Q1_up_plus, G4_2015.Na_K.Q2_up_plus, G4_2015.Na_K.Q3_up_plus, G4_2015.Na_K.Q4_up_plus)
G4_2015.Na_K.Qs.minus.list <- list(G4_2015.Na_K.Q1_up_minus, G4_2015.Na_K.Q2_up_minus, G4_2015.Na_K.Q3_up_minus, G4_2015.Na_K.Q4_up_minus)
G4_2015.Na_K.Qs.plus.down.list <- list(G4_2015.Na_K.Q1_down_plus, G4_2015.Na_K.Q2_down_plus, G4_2015.Na_K.Q3_down_plus, G4_2015.Na_K.Q4_down_plus)
G4_2015.Na_K.Qs.minus.down.list <- list(G4_2015.Na_K.Q1_down_minus, G4_2015.Na_K.Q2_down_minus, G4_2015.Na_K.Q3_down_minus, G4_2015.Na_K.Q4_down_minus)
G4_2015.Na_K.window_len = 2000
G4_2015.Na_K.Qs.total <- get_total_Qs(G4_2015.Na_K.Qs.plus.up.list, G4_2015.Na_K.Qs.minus.list, G4_2015.Na_K.Qs.plus.down.list, G4_2015.Na_K.Qs.minus.down.list, G4_2015.Na_K.window_len)
ggplot(G4_2015.Na_K.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-200,200)) +
  facet_grid( . ~ exon_pos ) +
  theme(text = element_text(size=15)) +
  theme_bw() + 
  labs(colour = "Splice site stregth quartile") +
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_PDS_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_PDS.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                       file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_PDS_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_PDS.Qs.plus.up.list <- list(G4_2015.template.Na_PDS.Q1_up_plus, G4_2015.template.Na_PDS.Q2_up_plus, G4_2015.template.Na_PDS.Q3_up_plus, G4_2015.template.Na_PDS.Q4_up_plus)
G4_2015.template.Na_PDS.Qs.minus.list <- list(G4_2015.template.Na_PDS.Q1_up_minus, G4_2015.template.Na_PDS.Q2_up_minus, G4_2015.template.Na_PDS.Q3_up_minus, G4_2015.template.Na_PDS.Q4_up_minus)
G4_2015.template.Na_PDS.Qs.plus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_plus, G4_2015.template.Na_PDS.Q2_down_plus, G4_2015.template.Na_PDS.Q3_down_plus, G4_2015.template.Na_PDS.Q4_down_plus)
G4_2015.template.Na_PDS.Qs.minus.down.list <- list(G4_2015.template.Na_PDS.Q1_down_minus, G4_2015.template.Na_PDS.Q2_down_minus, G4_2015.template.Na_PDS.Q3_down_minus, G4_2015.template.Na_PDS.Q4_down_minus)
G4_2015.template.Na_PDS.window_len = 2000
G4_2015.template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.template.Na_PDS.Qs.plus.up.list, G4_2015.template.Na_PDS.Qs.minus.list, G4_2015.template.Na_PDS.Qs.plus.down.list, G4_2015.template.Na_PDS.Qs.minus.down.list, window_len)
G4_2015.non_template.Na_PDS.Qs.plus.up.list <- list(G4_2015.non_template.Na_PDS.Q1_up_plus, G4_2015.non_template.Na_PDS.Q2_up_plus, G4_2015.non_template.Na_PDS.Q3_up_plus, G4_2015.non_template.Na_PDS.Q4_up_plus)
G4_2015.non_template.Na_PDS.Qs.minus.list <- list(G4_2015.non_template.Na_PDS.Q1_up_minus, G4_2015.non_template.Na_PDS.Q2_up_minus, G4_2015.non_template.Na_PDS.Q3_up_minus, G4_2015.non_template.Na_PDS.Q4_up_minus)
G4_2015.non_template.Na_PDS.Qs.plus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_plus, G4_2015.non_template.Na_PDS.Q2_down_plus, G4_2015.non_template.Na_PDS.Q3_down_plus, G4_2015.non_template.Na_PDS.Q4_down_plus)
G4_2015.non_template.Na_PDS.Qs.minus.down.list <- list(G4_2015.non_template.Na_PDS.Q1_down_minus, G4_2015.non_template.Na_PDS.Q2_down_minus, G4_2015.non_template.Na_PDS.Q3_down_minus, G4_2015.non_template.Na_PDS.Q4_down_minus)
G4_2015.non_template.Na_PDS.window_len = 2000
G4_2015.non_template.Na_PDS.Qs.total <- get_total_Qs(G4_2015.non_template.Na_PDS.Qs.plus.up.list, G4_2015.non_template.Na_PDS.Qs.minus.list, G4_2015.non_template.Na_PDS.Qs.plus.down.list, G4_2015.non_template.Na_PDS.Qs.minus.down.list, window_len)
G4_2015.template.Na_PDS.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1          3230     3421     0.9441684          3119   3238.5     0.9631002        6349   6677   0.9508761   Upstream
    2:    -1000 2          2693     2711     0.9933604          2396   2540.0     0.9433071        5089   5232   0.9726682   Upstream
    3:    -1000 3          1991     1997     0.9969955          1927   1975.0     0.9756962        3918   3998   0.9799900   Upstream
    4:    -1000 4          1455     1331     1.0931630          1357   1287.0     1.0543901        2812   2635   1.0671727   Upstream
    5:     -999 1          3244     3421     0.9482607          3112   3238.5     0.9609387        6356   6677   0.9519245   Upstream
   ---                                                                                                                               
15988:      997 4          1716     2058     0.8338192          1686   2051.0     0.8220380        3402   4144   0.8209459 Downstream
15989:      998 1          2169     2586     0.8387471          2143   2386.0     0.8981559        4312   4961   0.8691796 Downstream
15990:      998 2          2130     2578     0.8262219          1926   2395.0     0.8041754        4056   4983   0.8139675 Downstream
15991:      998 3          1854     2200     0.8427273          1865   2153.0     0.8662332        3719   4357   0.8535690 Downstream
15992:      998 4          1716     2058     0.8338192          1684   2051.0     0.8210629        3400   4144   0.8204633 Downstream
G4_2015.non_template.Na_PDS.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1          2746   2794.0     0.9828203          2528   2744.0     0.9212828        5274   5538   0.9523294   Upstream
    2:    -1000 2          2178   2259.0     0.9641434          1987   2130.0     0.9328638        4165   4378   0.9513476   Upstream
    3:    -1000 3          1591   1697.0     0.9375368          1566   1590.0     0.9849057        3157   3266   0.9666258   Upstream
    4:    -1000 4          1190   1162.0     1.0240964          1095   1068.0     1.0252809        2285   2223   1.0278902   Upstream
    5:     -999 1          2736   2794.0     0.9792412          2533   2744.0     0.9231050        5269   5538   0.9514265   Upstream
   ---                                                                                                                               
15988:      997 4          1671   1744.0     0.9581422          1540   1686.0     0.9134045        3211   3394   0.9460813 Downstream
15989:      998 1          2109   2196.0     0.9603825          1862   2021.0     0.9213261        3971   4204   0.9445766 Downstream
15990:      998 2          1996   2118.5     0.9421761          1846   2024.5     0.9118301        3842   4140   0.9280193 Downstream
15991:      998 3          1793   1857.0     0.9655358          1733   1799.0     0.9633130        3526   3665   0.9620737 Downstream
15992:      998 4          1672   1744.0     0.9587156          1545   1686.0     0.9163701        3217   3394   0.9478491 Downstream
G4_2015.template_non_template.Na_PDS.Qs.total <- rbind(G4_2015.template.Na_PDS.Qs.total, G4_2015.non_template.Na_PDS.Qs.total)
  
half_n <- nrow(G4_2015.template_non_template.Na_PDS.Qs.total)/2
G4_2015.template_non_template.Na_PDS.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
  
  
  
  
G4_2015.template_non_template.Na_PDS.Qs.total$Strand <-  factor(G4_2015.template_non_template.Na_PDS.Qs.total$Strand, levels=c("Template", "Non-template" ))
  
G4_2015.template_non_template.Na_PDS.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_PDS.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_PDS.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand <-  factor(G4_2015.template_non_template.Na_PDS.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_PDS.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-300,300)) +
  facet_grid( new_Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

G4_2015.template.Na_K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q1_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q2_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q3_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q4_up_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                 file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q1_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q2_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q3_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q4_up_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.up_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q1_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q1.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q2_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q2.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q3_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q3.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q4_down_plus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                   file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_plus.q4.bed.score.GSE63874_Na_K_plus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q1_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q1.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q2_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q2.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q3_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q3.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.non_template.Na_K.Q4_down_minus <- read_dist_table("/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                     file
  2  -- 2001 columns 2002 columns '/Users/gp7/Google_Drive/Results/Non_B/G4_seq_2015/exon.down_minus.q4.bed.score.GSE63874_Na_K_minus_hits_intersect.bed.bed.list.out.num'
G4_2015.template.Na_K.Qs.plus.up.list <- list(G4_2015.template.Na_K.Q1_up_plus, G4_2015.template.Na_K.Q2_up_plus, G4_2015.template.Na_K.Q3_up_plus, G4_2015.template.Na_K.Q4_up_plus)
G4_2015.template.Na_K.Qs.minus.list <- list(G4_2015.template.Na_K.Q1_up_minus, G4_2015.template.Na_K.Q2_up_minus, G4_2015.template.Na_K.Q3_up_minus, G4_2015.template.Na_K.Q4_up_minus)
G4_2015.template.Na_K.Qs.plus.down.list <- list(G4_2015.template.Na_K.Q1_down_plus, G4_2015.template.Na_K.Q2_down_plus, G4_2015.template.Na_K.Q3_down_plus, G4_2015.template.Na_K.Q4_down_plus)
G4_2015.template.Na_K.Qs.minus.down.list <- list(G4_2015.template.Na_K.Q1_down_minus, G4_2015.template.Na_K.Q2_down_minus, G4_2015.template.Na_K.Q3_down_minus, G4_2015.template.Na_K.Q4_down_minus)
G4_2015.template.Na_K.window_len = 2000
G4_2015.template.Na_K.Qs.total <- get_total_Qs(G4_2015.template.Na_K.Qs.plus.up.list, G4_2015.template.Na_K.Qs.minus.list, G4_2015.template.Na_K.Qs.plus.down.list, G4_2015.template.Na_K.Qs.minus.down.list, window_len)
G4_2015.non_template.Na_K.Qs.plus.up.list <- list(G4_2015.non_template.Na_K.Q1_up_plus, G4_2015.non_template.Na_K.Q2_up_plus, G4_2015.non_template.Na_K.Q3_up_plus, G4_2015.non_template.Na_K.Q4_up_plus)
G4_2015.non_template.Na_K.Qs.minus.list <- list(G4_2015.non_template.Na_K.Q1_up_minus, G4_2015.non_template.Na_K.Q2_up_minus, G4_2015.non_template.Na_K.Q3_up_minus, G4_2015.non_template.Na_K.Q4_up_minus)
G4_2015.non_template.Na_K.Qs.plus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_plus, G4_2015.non_template.Na_K.Q2_down_plus, G4_2015.non_template.Na_K.Q3_down_plus, G4_2015.non_template.Na_K.Q4_down_plus)
G4_2015.non_template.Na_K.Qs.minus.down.list <- list(G4_2015.non_template.Na_K.Q1_down_minus, G4_2015.non_template.Na_K.Q2_down_minus, G4_2015.non_template.Na_K.Q3_down_minus, G4_2015.non_template.Na_K.Q4_down_minus)
G4_2015.non_template.Na_K.window_len = 2000
G4_2015.non_template.Na_K.Qs.total <- get_total_Qs(G4_2015.non_template.Na_K.Qs.plus.up.list, G4_2015.non_template.Na_K.Qs.minus.list, G4_2015.non_template.Na_K.Qs.plus.down.list, G4_2015.non_template.Na_K.Qs.minus.down.list, window_len)
G4_2015.template.Na_K.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1          2362   2490.0     0.9485944          2292   2412.0     0.9502488        4654   4893   0.9511547   Upstream
    2:    -1000 2          1928   1952.0     0.9877049          1753   1901.0     0.9221462        3681   3861   0.9533800   Upstream
    3:    -1000 3          1549   1514.0     1.0231176          1497   1471.0     1.0176751        3046   2984   1.0207775   Upstream
    4:    -1000 4          1099   1038.0     1.0587669          1074   1000.0     1.0740000        2173   2036   1.0672888   Upstream
    5:     -999 1          2356   2490.0     0.9461847          2299   2412.0     0.9531509        4655   4893   0.9513591   Upstream
   ---                                                                                                                               
15988:      997 4          1294   1470.5     0.8799728          1309   1463.5     0.8944312        2603   2934   0.8871847 Downstream
15989:      998 1          1609   1914.0     0.8406479          1565   1797.0     0.8708959        3174   3710   0.8555256 Downstream
15990:      998 2          1556   1874.0     0.8303095          1486   1786.0     0.8320269        3042   3657   0.8318294 Downstream
15991:      998 3          1403   1633.0     0.8591549          1386   1618.0     0.8566131        2789   3265   0.8542113 Downstream
15992:      998 4          1294   1470.5     0.8799728          1305   1463.5     0.8916980        2599   2934   0.8858214 Downstream
G4_2015.non_template.Na_K.Qs.total
       Position Q Occurrences.x median.x Enrrichment.x Occurrences.y median.y Enrrichment.y Occurrences median Enrrichment   exon_pos
    1:    -1000 1          1927   2021.0     0.9534884          1792   1970.5     0.9094139        3719   3995   0.9309136   Upstream
    2:    -1000 2          1575   1674.5     0.9405793          1500   1575.5     0.9520787        3075   3242   0.9484886   Upstream
    3:    -1000 3          1265   1280.0     0.9882812          1183   1197.0     0.9883041        2448   2474   0.9894907   Upstream
    4:    -1000 4           930    926.0     1.0043197           870    852.0     1.0211268        1800   1765   1.0198300   Upstream
    5:     -999 1          1924   2021.0     0.9520040          1795   1970.5     0.9109363        3719   3995   0.9309136   Upstream
   ---                                                                                                                               
15988:      997 4          1320   1303.0     1.0130468          1142   1275.0     0.8956863        2462   2566   0.9594700 Downstream
15989:      998 1          1569   1623.0     0.9667283          1369   1523.5     0.8985888        2938   3121   0.9413649 Downstream
15990:      998 2          1468   1579.0     0.9297023          1422   1466.0     0.9699864        2890   3039   0.9509707 Downstream
15991:      998 3          1368   1408.0     0.9715909          1280   1327.0     0.9645818        2648   2734   0.9685443 Downstream
15992:      998 4          1319   1303.0     1.0122794          1145   1275.0     0.8980392        2464   2566   0.9602494 Downstream
G4_2015.template_non_template.Na_K.Qs.total <- rbind(G4_2015.template.Na_K.Qs.total, G4_2015.non_template.Na_K.Qs.total)
  
half_n <- nrow(G4_2015.template_non_template.Na_K.Qs.total)/2
G4_2015.template_non_template.Na_K.Qs.total[, Strand:=rep(c("Template", "Non-template"), each=half_n) ]
  
  
  
  
G4_2015.template_non_template.Na_K.Qs.total$Strand <-  factor(G4_2015.template_non_template.Na_K.Qs.total$Strand, levels=c("Template", "Non-template" ))
  
G4_2015.template_non_template.Na_K.Qs.total$Q <- mapvalues(G4_2015.template_non_template.Na_K.Qs.total$Q,  from =c(1:4), to =c("Q1", "Q2", "Q3", "Q4"))
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Non-template" , new_Strand:="Template"]
G4_2015.template_non_template.Na_K.Qs.total[Strand=="Template" , new_Strand:="Non-template"]
G4_2015.template_non_template.Na_K.Qs.total$new_Strand <-  factor(G4_2015.template_non_template.Na_K.Qs.total$new_Strand, levels=c("Template", "Non-template" ))
ggplot(G4_2015.template_non_template.Na_K.Qs.total)+
  geom_line(aes(x=Position,y=Enrrichment, colour=Q)) +
  xlim(c(-300,300)) +
  facet_grid( new_Strand ~ exon_pos ) +
  labs(colour = "Splice site stregth quartile") +
  theme_bw()  + 
  theme(legend.position = "top", legend.direction = "horizontal")

KCl RNA-seq

As K+ is known to stabilize G4, we analized (RNA-seq data)[https://www.ncbi.nlm.nih.gov/bioproject/PRJEB19451] comming from neurons after 4-hour KCl-indused depolarization.

KCL_human_upstream <- fread("./KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s"  )
colnames(KCL_human_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_human_downstream<- fread("./KCL/MicroExonator/Control_vs_KCL.diff.downstream_100nt.G4s"  )
colnames(KCL_human_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_human <-  merge(KCL_human_upstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ],
                    KCL_human_downstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ], 
                    by=c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability") )
KCL_human[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_human[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_human$G4_bol <- factor(KCL_human$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_human[end - start > 30, exon:="exon" ]
KCL_human[end - start <= 30, exon:="microexon" ]
size.var=0.5
alpha.var=0.25
 ggplot(data=KCL_human[ Type=="CE",]) +
  geom_point( aes(x=-DeltaPsi, y=Probability), colour="grey", alpha=alpha.var, size=size.var) +
  geom_point(data=KCL_human[Type=="CE" & DeltaPsi>0.1 & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="skyblue", alpha=alpha.var, size=size.var) +
   geom_point(data=KCL_human[Type=="CE" & DeltaPsi<(-0.1) & Probability>0.9, ], aes(x=-DeltaPsi, y=Probability), colour="red", alpha=alpha.var, size=size.var) +
  xlim(c(-0.8, 0.8)) +
  facet_grid( . ~ G4_bol  ) +
  xlab("DeltaPSI (Control - KCl)") +
  theme_bw()

To highlight NRXN2, SHANK1 and RBM10 we used biomaRt to find the gene name to Ensembl ID correspondence

library(biomaRt)
ensembl = useEnsembl(biomart="ensembl", dataset="hsapiens_gene_ensembl")
KCL_human[ Type=="CE"& DeltaPsi>0.1 & Probability>0.9,  ]
      chrom     start       end strand Type DeltaPsi Probability G4.x G4.y               G4_bol      exon Delta_type
   1:  chr1    898717    898884      +   CE  0.10456       0.983    0    0 Without G-quadruplex      exon     Skiped
   2:  chr1    998459    998581      +   CE  0.66515       1.000    0    0 Without G-quadruplex      exon     Skiped
   3:  chr1   1417925   1417994      +   CE  0.19193       1.000    0    0 Without G-quadruplex      exon     Skiped
   4:  chr1   1420396   1420551      +   CE  0.11443       0.989    0    1    With G-quadruplex      exon     Skiped
   5:  chr1   1425072   1425191      +   CE  0.25542       0.995    1    0    With G-quadruplex      exon     Skiped
  ---                                                                                                               
2330:  chrX 133372809 133372870      +   CE  0.36421       0.968    0    0 Without G-quadruplex      exon     Skiped
2331:  chrX 149882951 149883001      +   CE  0.27179       0.976    0    0 Without G-quadruplex      exon     Skiped
2332:  chrX 153224020 153224217      -   CE  0.17532       0.999    0    0 Without G-quadruplex      exon     Skiped
2333:  chrX 153585619 153585642      -   CE  0.24249       0.999    0    0 Without G-quadruplex microexon     Skiped
2334:  chrX 153872153 153872305      -   CE  0.19742       0.923    1    0    With G-quadruplex      exon     Skiped
KCL_human[, Coords:=paste(chrom, paste(start, end, sep = "-"), strand, sep=":" )]
whippet.jls.exons.hg19 <-  fread("./KCL/whippet.jls.exons.tab")
KCL_human_CE <- merge(KCL_human[Type=="CE", ], whippet.jls.exons.hg19, by.x="Coords", by.y="Potential_Exon")
KCL_human_CE[ , ensembl_gene_id:=vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)]
KCL_human_CE_genes <-  data.table(getBM(attributes=c('ensembl_gene_id', "wikigene_description", "hgnc_symbol"),filters = 'ensembl_gene_id', values = unique(vapply(strsplit(KCL_human_CE$Gene, ".", fixed = TRUE), "[", "", 1)) , mart = ensembl))

Batch submitting query [=====>--------------------------------------------------------------------------------------]   7% eta:  2m
Batch submitting query [=========>----------------------------------------------------------------------------------]  10% eta: 11m
Batch submitting query [============>-------------------------------------------------------------------------------]  14% eta: 14m
Batch submitting query [===============>----------------------------------------------------------------------------]  17% eta: 12m
Batch submitting query [==================>-------------------------------------------------------------------------]  21% eta: 10m
Batch submitting query [=====================>----------------------------------------------------------------------]  24% eta: 10m
Batch submitting query [========================>-------------------------------------------------------------------]  28% eta: 14m
Batch submitting query [============================>---------------------------------------------------------------]  31% eta: 15m
Batch submitting query [===============================>------------------------------------------------------------]  34% eta: 15m
Batch submitting query [==================================>---------------------------------------------------------]  38% eta: 14m
Batch submitting query [=====================================>------------------------------------------------------]  41% eta: 13m
Batch submitting query [========================================>---------------------------------------------------]  45% eta: 12m
Batch submitting query [===========================================>------------------------------------------------]  48% eta: 11m
Batch submitting query [===============================================>--------------------------------------------]  52% eta: 10m
Batch submitting query [==================================================>-----------------------------------------]  55% eta: 10m
Batch submitting query [=====================================================>--------------------------------------]  59% eta:  9m
Batch submitting query [========================================================>-----------------------------------]  62% eta:  8m
Batch submitting query [===========================================================>--------------------------------]  66% eta:  7m
Batch submitting query [==============================================================>-----------------------------]  69% eta:  6m
Batch submitting query [==================================================================>-------------------------]  72% eta:  5m
Batch submitting query [=====================================================================>----------------------]  76% eta:  5m
Batch submitting query [========================================================================>-------------------]  79% eta:  4m
Batch submitting query [===========================================================================>----------------]  83% eta:  3m
Batch submitting query [==============================================================================>-------------]  86% eta:  2m
Batch submitting query [=================================================================================>----------]  90% eta:  2m
Batch submitting query [=====================================================================================>------]  93% eta:  1m
Batch submitting query [========================================================================================>---]  97% eta: 38s
Batch submitting query [============================================================================================] 100% eta:  0s
                                                                                                                                   
KCL_human_CE <-  merge(KCL_human_CE, KCL_human_CE_genes, by="ensembl_gene_id")
KCL_human_CE[ hgnc_symbol=="GRIN1",  ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.85,  ]
Empty data.table (0 rows and 19 cols): ensembl_gene_id,Coords,chrom,start,end,strand...
KCL_human_CE[ hgnc_symbol=="NRXN2",  ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.9,  ]
   ensembl_gene_id                    Coords chrom    start      end strand Type DeltaPsi Probability G4.x G4.y               G4_bol
1: ENSG00000110076 chr11:64393935-64394024:- chr11 64393935 64394024      -   CE  0.10148       0.976    0    0 Without G-quadruplex
2: ENSG00000110076 chr11:64421168-64421194:- chr11 64421168 64421194      -   CE  0.21315       0.992    3    2    With G-quadruplex
        exon Delta_type               Gene Whippet_Nodes Is_Annotated wikigene_description hgnc_symbol
1:      exon     Skiped ENSG00000110076.14            41            Y           neurexin 2       NRXN2
2: microexon     Skiped ENSG00000110076.14            24            Y           neurexin 2       NRXN2
KCL_human_CE[ hgnc_symbol=="SHANK1",  ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.85,  ]
   ensembl_gene_id                    Coords chrom    start      end strand Type DeltaPsi Probability G4.x G4.y            G4_bol      exon
1: ENSG00000161681 chr19:51190274-51190297:- chr19 51190274 51190297      -   CE  0.18128       0.899    2    2 With G-quadruplex microexon
   Delta_type               Gene Whippet_Nodes Is_Annotated                      wikigene_description hgnc_symbol
1:       None ENSG00000161681.11            28            Y SH3 and multiple ankyrin repeat domains 1      SHANK1
KCL_human_CE[ hgnc_symbol=="RBM10",  ][ Type=="CE"& DeltaPsi>0.1 & Probability>0.9,  ]
   ensembl_gene_id                   Coords chrom    start      end strand Type DeltaPsi Probability G4.x G4.y            G4_bol exon
1: ENSG00000182872 chrX:47034418-47034491:+  chrX 47034418 47034491      +   CE  0.24869       0.989    1    2 With G-quadruplex exon
   Delta_type               Gene Whippet_Nodes Is_Annotated         wikigene_description hgnc_symbol
1:     Skiped ENSG00000182872.11             9            Y RNA binding motif protein 10       RBM10
  

To analyse all the Whippet node types, we calculate the odd-ratios of being differentially included given the G4 presence or absence

KCL_human[  , diff:="NA"]
KCL_human[ (DeltaPsi<=-0.1 & Probability>=0.9) , diff:="In"]
KCL_human[ (DeltaPsi>0.1 & Probability>=0.9) , diff:="Ex"]
KCL_human_stats <- merge(KCL_human[  G4_bol=="Without G-quadruplex",  .(WO_G4=.N) , by=c("Type", "diff")  ], 
KCL_human[  G4_bol=="With G-quadruplex",  .(W_G4=.N) , by=c("Type", "diff")  ],
by=c("Type", "diff"))
KCL_human_stats <- merge(KCL_human_stats[diff!="NA"],  KCL_human_stats[diff=="NA" , .(Type,  WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_human_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_human_stats[ , OR := W_G4_fraq/WO_G4_fraq]
ggplot(KCL_human_stats) +
   geom_tile( aes(Type, diff, fill = log2(OR))) +
   scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 0, limits = c(-1.6, 1.6)) +
    theme(legend.position = "bottom", legend.direction = "horizontal") +
      theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)

We use chi-squared test to calculate the significance

KCL_human_stats
    Type diff WO_G4 W_G4 WO_G4_NA W_G4_NA  WO_G4_fraq   W_G4_fraq        OR              P_value P_value.Bonferroni
 1:   AA   Ex   181   44     7852    1216 0.023051452 0.036184211 1.5697150   0.0104250635039261       1.459509e-01
 2:   AA   In   149   25     7852    1216 0.018976057 0.020559211 1.0834290    0.798797079630672       1.118316e+01
 3:   AD   Ex   132   41     6161    1590 0.021425093 0.025786164 1.2035496    0.352366558625256       4.933132e+00
 4:   AD   In   117   33     6161    1590 0.018990424 0.020754717 1.0929044    0.730608053514262       1.022851e+01
 5:   AF   Ex    29   10     5305    1562 0.005466541 0.006402049 1.1711334    0.811568365338675       1.136196e+01
 6:   AF   In    21   17     5305    1562 0.003958530 0.010883483 2.7493750  0.00248496072149905       3.478945e-02
 7:   CE   Ex  1932  414    98192   13380 0.019675737 0.030941704 1.5725817 1.26446783231537e-16       1.770255e-15
 8:   CE   In   263   24    98192   13380 0.002678426 0.001793722 0.6696926   0.0718465984186741       1.005852e+00
 9:   RI   Ex   202   62     6858    2078 0.029454652 0.029836381 1.0129599    0.989232440068338       1.384925e+01
10:   RI   In   135   48     6858    2078 0.019685039 0.023099134 1.1734360     0.39311627657307       5.503628e+00
11:   TE   Ex  1911  207    59722    7132 0.031998259 0.029024117 0.9070530    0.200964708425952       2.813506e+00
12:   TE   In  1868  185    59722    7132 0.031278256 0.025939428 0.8293118   0.0180879402239997       2.532312e-01
13:   TS   Ex  1027  522    36794   19111 0.027912160 0.027314112 0.9785740    0.711119460007881       9.955672e+00
14:   TS   In  1035  527    36794   19111 0.028129586 0.027575742 0.9803110    0.734230163811721       1.027922e+01
library(plyr)
Fig5.A1 <- ggplot(KCL_human_stats) +
  geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 
Fig5.A1

splice_node_dot_plot <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path  )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_x_downstream<- fread(downstream.path  )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_x <-  merge(KCL_x_upstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ],
                    KCL_x_downstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ], 
                    by=c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability") )
#KCL_x <-  KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[  , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[  G4_bol=="Without G-quadruplex",  .(WO_G4=.N) , by=c("Type", "diff")  ], 
KCL_x[  G4_bol=="With G-quadruplex",  .(W_G4=.N) , by=c("Type", "diff")  ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"],  KCL_x_stats[diff=="NA" , .(Type,  WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
  
matrix.ex <-  matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex)
matrix.in <-  matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value)) 
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value)) 
                                                        
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
  geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 
return(KCL_x_stats)
}
upstream.path = "./KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s" 
downstream.path = "./KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s" 
splice_node_dot_plot2 <- function(upstream.path, downstream.path ) {
KCL_x_upstream <- fread(upstream.path  )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_x_downstream<- fread(downstream.path  )
colnames(KCL_x_downstream) <-c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "G4"  )
KCL_x <-  merge(KCL_x_upstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ],
                    KCL_x_downstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "G4") ], 
                    by=c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability") )
#KCL_x <-  KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(G4.x>0 | G4.y>0 ), G4_bol:="With G-quadruplex"]
KCL_x[(G4.x==0 & G4.y==0 ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[  , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[  G4_bol=="Without G-quadruplex",  .(WO_G4=.N) , by=c("Type", "diff")  ], 
KCL_x[  G4_bol=="With G-quadruplex",  .(W_G4=.N) , by=c("Type", "diff")  ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"],  KCL_x_stats[diff=="NA" , .(Type,  WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL"]$Type)){
  
matrix <-  matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.res <- chisq.test(matrix)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i,  matrix.res$p.value)) 
                                                        
}
colnames(KCL_x_stats.chi) <- c("Type", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
#KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
#ggplot(KCL_x_stats.chi) +
#  geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
#  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
#  theme_bw() +
#      theme(legend.position = "top", legend.direction = "horizontal") 
return(KCL_x_stats.chi)
}
diff_G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path  )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_upstream[ ,dist:=((gstart + (gend- gstart)/2) -w.start  ) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path  )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_downstream[ ,dist:=((gstart + (gend- gstart)/2)) - w.start   ]
KCL_x <-  merge(KCL_x_upstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "dist") ],
                    KCL_x_downstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "dist") ], 
                    by=c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability") )
#KCL_x <-  KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[strand=="+" & ((dist.x >= -dist_lim &  dist.x  <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[strand=="-" & ((dist.y >= -dist_lim &  dist.y  <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[  , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x <- KCL_x[Type=="CE"]
KCL_x[ ,  exon_class:="exon"]
KCL_x[end-start<=30,  exon_class:="microexon" ]
return(KCL_x)
}
upstream.path = "./Exons_G4s/human.exons.tvs.upstream.G4seq_K"
downstream.path = "./Exons_G4s/human.exons.tvs.downstream.G4seq_K"
G4_ME_table <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path  )
colnames(KCL_x_upstream) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand",  "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_upstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
#KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x_downstream<- fread(downstream.path  )
colnames(KCL_x_downstream) <- c( "chrom", "sstart", "send", "strand", "start", "end", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_downstream[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
KCL_x <-  merge(KCL_x_upstream[, c( "chrom", "start", "end", "strand", "dist") ],
                    KCL_x_downstream[, c( "chrom", "start", "end", "strand", "dist") ], 
                    by=c( "chrom", "start", "end", "strand") )
#KCL_x <-  KCL_x[end-start>30 || Type!="CE", ]
KCL_x[ , G4_bol:="Without G-quadruplex"]
KCL_x[ strand=="+" & ((dist.x >= -dist_lim &  dist.x  <= 0) | ( dist.y >=0 & dist.y<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x[ strand=="-" & ((dist.y >= -dist_lim &  dist.y  <= 0) | ( dist.x >=0 & dist.x<=dist_lim)) , G4_bol:="With G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[ ,  exon_class:="exon"]
KCL_x[end-start<=30,  exon_class:="microexon" ]
return(KCL_x)
}
KCL_human_CE <- KCL_human[ , paste(chrom,   start,     end, sep="_" ) ]
human.exons.upstream.G4s <- fread("./Exons_G4s/human.exons.tvs.upstream.G4s")
human.exons.downstream.G4s <- fread("./Exons_G4s/human.exons.tvs.downstream.G4s")
colnames(human.exons.upstream.G4s) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand",  "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
human.exons.upstream.G4s[ ,dist:=(sstart - (gstart + (gend- gstart)/2)) ]
human.exons.upstream.G4s[, exon_len:=end-start]
human.exons.upstream.G4s[ , G4_bol:="Without G-quadruplex"]
human.exons.upstream.G4s[ dist>=-100  & dist<=0 , G4_bol:="With G-quadruplex"]
human.exons.upstream.G4s[ , ID:=paste(chrom,   start,     end, sep="_" )]
human.exons.upstream.G4s[, filter:="Out"]
human.exons.upstream.G4s[ ID %in%  KCL_human_CE, ]
        chrom   sstart     send sstrand    start      end strand gchrom   gstart     gend            gscore exon_dist    dist exon_len
     1:  chr1    15038    15039       -    15005    15038      -   chr1    16797    16846       16797_16846      1759 -1783.5       33
     2:  chr1    15947    15948       -    15904    15947      -   chr1    16797    16846       16797_16846       850  -874.5       43
     3:  chr1    16745    16746       -    16607    16745      -   chr1    16797    16846       16797_16846        52   -76.5      138
     4:  chr1    17364    17365       -    17233    17364      -   chr1    17545    17594       17545_17594       181  -205.5      131
     5:  chr1    17504    17505       -    17498    17504      -   chr1    17545    17594       17545_17594        41   -65.5        6
    ---                                         
human.exons.downstream.G4s <- fread("./Exons_G4s/human.exons.tvs.downstream.G4seq_PDS")
colnames(human.exons.downstream.G4s) <- c( "chrom", "sstart", "send", "sstrand", "start", "end", "strand",  "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
human.exons.downstream.G4s[ ,dist:=( (gstart + (gend- gstart)/2) - sstart) ]
human.exons.downstream.G4s[ sstrand=="-", dist:=(   sstart - (gstart + (gend- gstart)/2)) ]
human.exons.downstream.G4s[, exon_len:=end-start]
human.exons.downstream.G4s[ , G4_bol:="Without G-quadruplex"]
human.exons.downstream.G4s[ dist<=100  & dist>=0 , G4_bol:="With G-quadruplex"]
human.exons.downstream.G4s[, exon_class:="exon"]
human.exons.downstream.G4s[ exon_len<=30, exon_class:="microexon"]
human.exons.downstream.G4s.2x2 <- matrix(ncol = 2,
c(nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(human.exons.downstream.G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test(human.exons.downstream.G4s.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  human.exons.downstream.G4s.2x2
X-squared = 8.2286, df = 1, p-value = 0.004123

hg19_ME_table_G4s[, median(exon_len), by=G4_bol]
                 G4_bol  V1
1: Without G-quadruplex 147
2:    With G-quadruplex 155
matrix(ncol=2, c( ))
human.ME_g4.stats <- data.table()
hg19_ME_table_G4s <- G4_ME_table("./Exons_G4s/human.exons.tvs.upstream.G4s" , "./Exons_G4s/human.exons.tvs.downstream.G4s", 100 )
hg19_ME_table_G4s.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_G4s[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
hg19_ME_table_G4s[ , exon_len:=end-start]
colnames(hg19_ME_table_G4s.2x2) <- c("exon", "microexon")
rownames(hg19_ME_table_G4s.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
human.ME_g4.stats <- rbind(human.ME_g4.stats,
                           cbind(
                             "motif",
                             chisq.test( hg19_ME_table_G4s.2x2)$p.value,
                             (hg19_ME_table_G4s.2x2[ 2 , 2 ]/hg19_ME_table_G4s.2x2[ 1 , 2 ]) / (hg19_ME_table_G4s.2x2[ 2 , 1 ]/hg19_ME_table_G4s.2x2[ 1 , 1 ])
                             ))
hg19_ME_table_K <- G4_ME_table("./Exons_G4s/human.exons.tvs.upstream.G4seq_K" , "./Exons_G4s/human.exons.tvs.downstream.G4seq_K", 100 )
hg19_ME_table_K.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_K[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_K.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  hg19_ME_table_K.2x2
X-squared = 775.72, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
                           cbind(
                             "K+",
                             chisq.test( hg19_ME_table_K.2x2)$p.value,
                             (hg19_ME_table_K.2x2[ 2 , 2 ]/hg19_ME_table_K.2x2[ 1 , 2 ]) / (hg19_ME_table_K.2x2[ 2 , 1 ]/hg19_ME_table_K.2x2[ 1 , 1 ])
                             ))
hg19_ME_table_PDS <- G4_ME_table("./Exons_G4s/human.exons.tvs.upstream.G4seq_PDS" , "./Exons_G4s/human.exons.tvs.downstream.G4seq_PDS", 100 )
hg19_ME_table_PDS.2x2 <- matrix(ncol = 2,
c(nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(hg19_ME_table_PDS[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( hg19_ME_table_PDS.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  hg19_ME_table_PDS.2x2
X-squared = 1311.3, df = 1, p-value < 2.2e-16
human.ME_g4.stats <- rbind(human.ME_g4.stats,
                           cbind(
                             "PDS",
                             chisq.test( hg19_ME_table_PDS.2x2)$p.value,
                             (hg19_ME_table_PDS.2x2[ 2 , 2 ]/hg19_ME_table_PDS.2x2[ 1 , 2 ]) / (hg19_ME_table_PDS.2x2[ 2 , 1 ]/hg19_ME_table_PDS.2x2[ 1 , 1 ])
                             ))
human.ME_g4.stats
      V1                   V2               V3
1: motif 5.27431665031594e-46 1.43471802302067
2:    K+ 1.62313466930488e-21 1.31759263167337
3:   PDS 1.90542366661142e-47  1.3092934132111
primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
ESC_derived_neuron_CD1_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_CD1_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV10_Tc1_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K", 100 )
total_mouse_K_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_K_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_K_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  total_mouse_K_ME_table.2x2
X-squared = 1.9867, df = 1, p-value = 0.1587
colnames(total_mouse_K_ME_table.2x2) <- c("exon", "microexon")
rownames(total_mouse_K_ME_table.2x2) <- c("Without G-quadruplex", "With G-quadruplex")
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
ESC_derived_neuron_CD1_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_CD1_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS", 100 )
total_mouse_PDS_ME_table <- unique(rbind(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
ESC_derived_neuron_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_CD1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")],
primary_cortical_neuron_DIV10_Tc1_PDS_ME_table[ , c("chrom" ,"start", "end", "strand", "Type", "G4_bol", "exon_class")]))
total_mouse_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(total_mouse_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( total_mouse_PDS_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  total_mouse_PDS_ME_table.2x2
X-squared = 3.915e-27, df = 1, p-value = 1
human_motif_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4s" , "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4s", 100 )   
|--------------------------------------------------|
|==================================================|
human_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
human_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_PDS", 100 )   
     
human_motif_ME_table[, ID:=paste( chrom, strand, start, end  , sep="_")]
human_K_ME_table[, ID:=paste( chrom, strand, start, end  , sep="_")]
human_PDS_ME_table[, ID:=paste( chrom, strand, start, end  , sep="_")]
All_human<- data.table(unique(c(         
human_motif_ME_table[G4_bol=="With G-quadruplex", ID],       
human_K_ME_table[G4_bol=="With G-quadruplex", ID],
human_PDS_ME_table[G4_bol=="With G-quadruplex", ID])))
colnames(All_human) <- "ID"
All_human[ ID %in% human_motif_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_motif:=TRUE   ]
All_human[ ID %in% human_K_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_K:=TRUE   ]
All_human[ ID %in% human_PDS_ME_table[abs(DeltaPsi)>=0.1 & Probability>=0.9 & G4_bol=="With G-quadruplex", ID ], diff_:=TRUE   ]
All_human <- cbind(All_human, rowSums(is.na(All_human)))
View(All_human.mouse.diff.gene[order(V2.y, V2.x  )][, c("ID", "mID", "V2.x", "V2.y", "wikigene_description", "hgnc_symbol")] )
Error in View : object 'V2.y' not found
KCL_human[ID=""]
total_mouse_PDS_ME_table[G4_bol=="Without G-quadruplex",  mean(exon_len) ]
[1] 135.2497
primary_cortical_neuron_DIV4_CD1_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K", 100 )
primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  primary_cortical_neuron_DIV4_CD1_K_ME_table.2x2
X-squared = 2.0509, df = 1, p-value = 0.1521
primary_cortical_neuron_DIV4_CD1_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_PDS", 100 )
primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(primary_cortical_neuron_DIV4_CD1_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  primary_cortical_neuron_DIV4_CD1_PDS_ME_table.2x2
X-squared = 1.0594, df = 1, p-value = 0.3034
Control_vs_KCL_K_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K" , "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_K_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_K_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_K_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  Control_vs_KCL_K_ME_table.2x2
X-squared = 0.026068, df = 1, p-value = 0.8717
Control_vs_KCL_PDS_ME_table <- diff_G4_ME_table("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS" , "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K", 100 )
Control_vs_KCL_PDS_ME_table.2x2 <- matrix(ncol = 2,
c(nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="exon" & G4_bol=="With G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="Without G-quadruplex"]),
nrow(Control_vs_KCL_PDS_ME_table[ exon_class=="microexon" & G4_bol=="With G-quadruplex"]) ))
chisq.test( Control_vs_KCL_PDS_ME_table.2x2)

    Pearson's Chi-squared test with Yates' continuity correction

data:  Control_vs_KCL_PDS_ME_table.2x2
X-squared = 10.324, df = 1, p-value = 0.001313
#upstream.path = "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.upstream.G4seq_K" 
#downstream.path = "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV4_CD1.diff.downstream.G4seq_K" 
#dist_lim = 150
upstream.path = "./AQ1/Control_vs_1mu.diff.downstream.G4seq_K"
downstream.path = "./AQ1/Control_vs_1mu.diff.upstream.G4seq_K"
dist_lim = 100
splice_node_dot_plot3 <- function(upstream.path, downstream.path, dist_lim ) {
KCL_x_upstream <- fread(upstream.path  )
colnames(KCL_x_upstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_upstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x_downstream<- fread(downstream.path  )
colnames(KCL_x_downstream) <- c("w.chrom", "w.start", "w.end", "w.strand", "chrom", "start", "end", "strand", "Type", "Psi_A", "Psi_B", "DeltaPsi", "Probability", "gchrom", "gstart", "gend", "gscore", "exon_dist"  )
KCL_x_downstream[ ,dist:=abs(w.start - (gstart + (gend- gstart)/2)) ]
KCL_x <-  merge(KCL_x_upstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "dist") ],
                    KCL_x_downstream[, c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability", "dist") ], 
                    by=c("chrom",  "start", "end", "strand",  "Type" ,  "DeltaPsi", "Probability") )
#KCL_x <-  KCL_x[end-start>30 || Type!="CE", ]
KCL_x[(dist.x<=dist_lim | dist.y<=dist_lim ), G4_bol:="With G-quadruplex"]
KCL_x[(dist.x>dist_lim & dist.y>dist_lim ), G4_bol:="Without G-quadruplex"]
KCL_x$G4_bol <- factor(KCL_x$G4_bol, levels=c("Without G-quadruplex", "With G-quadruplex") )
KCL_x[  , diff:="NA"]
KCL_x[ (DeltaPsi<=-0.1 & Probability>=0.90) , diff:="In"]
KCL_x[ (DeltaPsi>0.1 & Probability>=0.90) , diff:="Ex"]
KCL_x_stats <- merge(KCL_x[  G4_bol=="Without G-quadruplex",  .(WO_G4=.N) , by=c("Type", "diff")  ], 
KCL_x[  G4_bol=="With G-quadruplex",  .(W_G4=.N) , by=c("Type", "diff")  ],
by=c("Type", "diff"))
KCL_x_stats <- merge(KCL_x_stats[diff!="NA"],  KCL_x_stats[diff=="NA" , .(Type,  WO_G4_NA=WO_G4, W_G4_NA=W_G4) ], by="Type")
KCL_x_stats[, `:=`(WO_G4_fraq=WO_G4/WO_G4_NA, W_G4_fraq=W_G4/W_G4_NA)]
KCL_x_stats[ , OR := W_G4_fraq/WO_G4_fraq]
KCL_x_stats.chi <- data.table()
for ( i in unique(KCL_x_stats[Type!="AL" & Type!="AF"]$Type)){
  
matrix.ex <-  matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="Ex"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$WO_G4, KCL_x_stats[Type==i & diff=="Ex"]$W_G4_NA, KCL_x_stats[Type==i & diff=="Ex"]$W_G4))
matrix.ex_res <- chisq.test(matrix.ex, correct=TRUE)
matrix.in <-  matrix(nrow=2, c(KCL_x_stats[Type==i & diff=="In"]$WO_G4_NA, KCL_x_stats[Type==i & diff=="In"]$WO_G4, KCL_x_stats[Type==i & diff=="In"]$W_G4_NA, KCL_x_stats[Type==i & diff=="In"]$W_G4))
matrix.in_res <- chisq.test(matrix.in, correct=TRUE)
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "Ex", matrix.ex_res$p.value)) 
KCL_x_stats.chi <- rbind(KCL_x_stats.chi, cbind(i, "In", matrix.in_res$p.value)) 
                                                        
}
colnames(KCL_x_stats.chi) <- c("Type", "diff", "P_value")
ntest = nrow(KCL_x_stats.chi)
KCL_x_stats.chi[ , `:=`(P_value.Bonferroni=as.numeric(P_value)*ntest) ]
KCL_x_stats <- merge(KCL_x_stats, KCL_x_stats.chi, by=c("Type", "diff"))
ggplot(KCL_x_stats) +
  geom_point(aes(Type, diff, size = -log(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 
return(KCL_x_stats)
}
test
           V1       V2       V3 V4    V5       V6       V7 V8 V9        V10        V11         V12   V13 V14
     1: chr10 33247060 33247260  - chr10 33247156 33247160  - TS 0.20852000 0.29307000 -0.08455300 0.681   2
     2: chr10 33247055 33247255  - chr10 33247148 33247155  - TS 0.00632510 0.00397540  0.00234980 0.614   2
     3: chr10 33247047 33247247  - chr10 33247147 33247147  - TS 0.00643090 0.00417170  0.00225920 0.593   2
     4: chr10 33247046 33247246  - chr10 33247138 33247146  - TS 0.20339000 0.22663000 -0.02324300 0.626   2
     5: chr10 33247037 33247237  - chr10 33247125 33247137  - TS 0.00637130 0.02837200 -0.02200100 0.709   2
    ---                                                                                                     
280986:  chrY  2606141  2606341  +  chrY  2606241  2606297  + CE 0.99405000 0.99588000 -0.00183480 0.565   0
280987:  chrY  2608720  2608920  +  chrY  2608820  2609142  + TE 0.00066347 0.00049058  0.00017289 0.564   0
280988:  chrY  2609043  2609243  +  chrY  2609143  2609166  + TE 0.46610000 0.45772000  0.00837880 0.558   0
280989:  chrY  2609067  2609267  +  chrY  2609167  2609350  + TE 0.53409000 0.54219000 -0.00810420 0.553   0
280990:  chrY  7171878  7172078  +  chrY  7171978  7172146  + CE 0.89609000 0.92204000 -0.02594900 0.564   0

AQ1

AQ1.1.PDS
    Type diff WO_G4 W_G4 WO_G4_NA W_G4_NA  WO_G4_fraq   W_G4_fraq        OR              P_value P_value.Bonferroni
 1:   AA   Ex   100   33     3417    2090 0.029265438 0.015789474 0.5395263  0.00269924680585348       3.239096e-02
 2:   AA   In   100   60     3417    2090 0.029265438 0.028708134 0.9809569    0.973326078843511       1.167991e+01
 3:   AD   Ex    74   40     2384    1659 0.031040268 0.024110910 0.7767623     0.23918041819642       2.870165e+00
 4:   AD   In    99   58     2384    1659 0.041526846 0.034960820 0.8418848    0.347044570353516       4.164535e+00
 5:   CE   Ex   978  182    35437   17223 0.027598273 0.010567265 0.3828959 2.32034593344643e-34       2.784415e-33
 6:   CE   In   277   94    35437   17223 0.007816689 0.005457818 0.6982263  0.00307047698059758       3.684572e-02
 7:   RI   Ex    41   66     2608    2897 0.015720859 0.022782188 1.4491695   0.0782381828984119       9.388582e-01
 8:   RI   In   188  168     2608    2897 0.072085890 0.057991025 0.8044712   0.0530363771218024       6.364365e-01
 9:   TE   Ex  1016  325    38550   13647 0.026355383 0.023814758 0.9036013    0.123388611952283       1.480663e+00
10:   TE   In  1185  373    38550   13647 0.030739300 0.027332014 0.8891554    0.054440043888416       6.532805e-01
11:   TS   Ex   358  290    15188   15858 0.023571240 0.018287300 0.7758310  0.00164147635842411       1.969772e-02
12:   TS   In   388  390    15188   15858 0.025546484 0.024593265 0.9626869    0.625880320055632       7.510564e+00

PDS

HEK.PDS.motif
    Type diff WO_G4 W_G4 WO_G4_NA W_G4_NA  WO_G4_fraq    W_G4_fraq        OR            P_value P_value.Bonferroni
 1:   AA   Ex    24    1     8692    1106 0.002761160 0.0009041591 0.3274563  0.404133875658452          4.8496065
 2:   AA   In    33    6     8692    1106 0.003796595 0.0054249548 1.4289002      0.58027008191          6.9632410
 3:   AD   Ex    18   11     7037    1579 0.002557908 0.0069664345 2.7234888 0.0131224789049098          0.1574697
 4:   AD   In    23    6     7037    1579 0.003268438 0.0037998733 1.1625960  0.929880747744654         11.1585690
 5:   CE   Ex   113   10   105508   13115 0.001071009 0.0007624857 0.7119322  0.373174639139558          4.4780957
 6:   CE   In   109   18   105508   13115 0.001033097 0.0013724743 1.3285047  0.328102827641871          3.9372339
 7:   RI   Ex    18   10     7849    2008 0.002293286 0.0049800797 2.1715914 0.0756378664437087          0.9076544
 8:   RI   In    15    6     7849    2008 0.001911071 0.0029880478 1.5635458  0.508860550818325          6.1063266
 9:   TE   Ex   310   28    58755    5848 0.005276147 0.0047879617 0.9074732  0.692122857490657          8.3054743
10:   TE   In   334   25    58755    5848 0.005684623 0.0042749658 0.7520228  0.199217416389958          2.3906090
11:   TS   Ex   156   61    37846   17028 0.004121968 0.0035823350 0.8690837  0.392722043288542          4.7126645
12:   TS   In   143   67    37846   17028 0.003778471 0.0039346958 1.0413461  0.842715736879803         10.1125888
human.dotplot <- splice_node_dot_plot2("./KCL/MicroExonator/Control_vs_KCL.diff.upstream_100nt.G4s",  "./KCL/MicroExonator/Control_vs_KCL.diff.downstream_100nt.G4s"  )
human.motif <- splice_node_dot_plot3("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4s",
                                        "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4s",
                                        100)
human.K <- splice_node_dot_plot3("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_K",
                                        "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_K",
                                        45)
human.PDS <- splice_node_dot_plot3("./KCL/MicroExonator/closest/Control_vs_KCL.diff.upstream.G4seq_PDS",
                                        "./KCL/MicroExonator/closest/Control_vs_KCL.diff.downstream.G4seq_PDS",
                                   45)
human.motif[ , G4_signal:="Motif"  ]
human.K[ , G4_signal:="K+"  ]
human.PDS[ , G4_signal:="PDS"  ]
human.motif_K_PDS <- rbind(human.motif, human.K, human.PDS)
human.motif_K_PDS$G4_signal <- factor(human.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
Fig5.A1 <- ggplot(human.motif_K_PDS) +
  geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  facet_grid(G4_signal ~ .) +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 
supp.dotplot.A <- splice_node_dot_plot2("./KCL/MicroExonator/ESC-derived_neuron_CD1.diff.upstream_100nt.G4s",  "./KCL/MicroExonator/ESC-derived_neuron_CD1.diff.downstream_100nt.G4s"  )
ESC_derived_neuron_CD1.motif <- splice_node_dot_plot3("./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4s.fix",
                                        "./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4s.fix",
                                        100)
Chi-squared approximation may be incorrect
ESC_derived_neuron_CD1.K <- splice_node_dot_plot3("./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_K",
                                        "./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_K",
                                        45)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
ESC_derived_neuron_CD1.PDS <- splice_node_dot_plot3("./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.upstream.G4seq_PDS",
                                        "./KCL/MicroExonator/closest/ESC-derived_neuron_CD1.diff.downstream.G4seq_PDS",
                                        45)
ESC_derived_neuron_CD1.motif[ , G4_signal:="Motif"  ]
ESC_derived_neuron_CD1.K[ , G4_signal:="K+"  ]
ESC_derived_neuron_CD1.PDS[ , G4_signal:="PDS"  ]
ESC_derived_neuron_CD1.motif_K_PDS <- rbind(ESC_derived_neuron_CD1.motif, ESC_derived_neuron_CD1.K, ESC_derived_neuron_CD1.PDS)
ESC_derived_neuron_CD1.motif_K_PDS$G4_signal <- factor(ESC_derived_neuron_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(ESC_derived_neuron_CD1.motif_K_PDS) +
  geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  facet_grid(G4_signal ~ .) +
  ylab("") +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 

supp.dotplot.C <-  splice_node_dot_plot2("./KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.upstream_100nt.G4s",  "./KCL/MicroExonator/primary_cortical_neuron_DIV10_CD1.diff.downstream_100nt.G4s"  )
primary_cortical_neuron_DIV10_CD1.motif <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4s.fix",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4s.fix",
                                        100)
primary_cortical_neuron_DIV10_CD1.K <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_K",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_K",
                                        45)
Chi-squared approximation may be incorrectChi-squared approximation may be incorrectChi-squared approximation may be incorrect
primary_cortical_neuron_DIV10_CD1.PDS <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.upstream.G4seq_PDS",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_CD1.diff.downstream.G4seq_PDS",
                                        45)
primary_cortical_neuron_DIV10_CD1.motif[ , G4_signal:="Motif"  ]
primary_cortical_neuron_DIV10_CD1.K[ , G4_signal:="K+"  ]
primary_cortical_neuron_DIV10_CD1.PDS[ , G4_signal:="PDS"  ]
primary_cortical_neuron_DIV10_CD1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_CD1.motif, primary_cortical_neuron_DIV10_CD1.K, primary_cortical_neuron_DIV10_CD1.PDS)
primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_CD1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_CD1.motif_K_PDS) +
  geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  facet_grid(G4_signal ~ .) +
  ylab("") +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 

supp.dotplot.D <- splice_node_dot_plot2("./KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.upstream_100nt.G4s",  "./KCL/MicroExonator/primary_cortical_neuron_DIV10_Tc1.diff.downstream_100nt.G4s"  )
primary_cortical_neuron_DIV10_Tc1.motif <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4s.fix",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4s.fix",
                                        100)
primary_cortical_neuron_DIV10_Tc1.K <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_K",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_K",
                                        45)
primary_cortical_neuron_DIV10_Tc1.PDS <- splice_node_dot_plot3("./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.upstream.G4seq_PDS",
                                        "./KCL/MicroExonator/closest/primary_cortical_neuron_DIV10_Tc1.diff.downstream.G4seq_PDS",
                                        45)
primary_cortical_neuron_DIV10_Tc1.motif[ , G4_signal:="Motif"  ]
primary_cortical_neuron_DIV10_Tc1.K[ , G4_signal:="K+"  ]
primary_cortical_neuron_DIV10_Tc1.PDS[ , G4_signal:="PDS"  ]
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS <- rbind(primary_cortical_neuron_DIV10_Tc1.motif, primary_cortical_neuron_DIV10_Tc1.K, primary_cortical_neuron_DIV10_Tc1.PDS)
primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal <- factor(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS$G4_signal, levels = c("Motif", "K+", "PDS") )
ggplot(primary_cortical_neuron_DIV10_Tc1.motif_K_PDS) +
  geom_point(aes(Type, diff, size = -log10(P_value.Bonferroni), shape=P_value.Bonferroni<0.05, colour=log2(OR) ) ) +
  scale_colour_gradient2(low="blue", high="red", mid = "grey", midpoint = 0) +
  facet_grid(G4_signal ~ .) +
  ylab("") +
  theme_bw() +
      theme(legend.position = "top", legend.direction = "horizontal") 

KCL_human[(DeltaPsi<=-0.1 & Probability>0.9), Delta_type:="Included"]
KCL_human[(DeltaPsi>=0.1 & Probability>0.9), Delta_type:="Skiped"]
KCL_human[is.na(Delta_type), Delta_type:="None"]
KCL_human_stats <-  KCL_human[Type=="CE" , .(count=.N), by=c("Delta_type", "exon", "G4_bol") ] 
KCL_human_stats[, total:=sum(count), by="G4_bol"]
KCL_human_stats[, fraction:=count/total]
Fig5.B <- ggplot() +
  geom_bar(data=KCL_human_stats[Delta_type!="None" & exon=="exon", ] , aes(x= G4_bol, y=fraction, group=Delta_type, fill=Delta_type ) , position="dodge", stat="identity"  ) +
  xlab("") +
  ylab("Fraction of differentially inclued exons ") +
  theme_bw() +
  guides(fill=guide_legend(title="Alternative splicing event")) +
    theme(legend.position = "top", legend.direction = "horizontal") 
Fig5.B

diff.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.up <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_upstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
eql.down <- read_dist_table("~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/Control_vs_KCL.diff_downstream_less.bed.score.All_G4.tsv.clean.txt..bed.list.out.num'
diff.up[, `:=`(type="diff", pos="up" )]
diff.down[, `:=`(type="diff", pos="down" )]
eql.up[, `:=`(type="eql", pos="up" )]
eql.down[, `:=`(type="eql", pos="down" )]
diff_eql <-  rbind(diff.up,  diff.down, eql.up, eql.down)
ggplot(diff_eql) +
  geom_line(aes(x=Position, y=Enrrichment, group=type)) +
  facet_grid(pos ~ .) +
  theme_bw() 

plot_eql_diff <- function(eql_up_plus, eql_up_minus, eql_down_plus, eql_down_minus, diff_up_plus, diff_up_minus, diff_down_plus, diff_down_minus   ){ 
diff.up_plus <- read_dist_table(diff_up_plus)
diff.up_minus <- read_dist_table(diff_up_minus)
diff.down_plus <- read_dist_table(diff_down_plus)
diff.down_minus <- read_dist_table(diff_down_minus)
diff.up_minus[,Position:=Position*-1]
diff.down_minus[,Position:=Position*-1]
diff.TOTAL <- plot_density(diff.up_plus, diff.up_minus, diff.down_plus, diff.down_minus)
eql.up_plus <- read_dist_table(eql_up_plus)
eql.up_minus <- read_dist_table(eql_up_minus)
eql.down_plus <- read_dist_table(eql_down_plus)
eql.down_minus <- read_dist_table(eql_down_minus)
eql.up_minus[,Position:=Position*-1]
eql.down_minus[,Position:=Position*-1]
eql.TOTAL <- plot_density(eql.up_plus, eql.up_minus, eql.down_plus, eql.down_minus)
diff.TOTAL[, type:="diff"]
eql.TOTAL[, type:="eql"]
diff_eql.TOTAL <- rbind(diff.TOTAL, eql.TOTAL)
ggplot(diff_eql.TOTAL) +
  geom_line(aes(x=Position, y=Enrrichment, color=type)) +
  xlim(c(-250,250)) +
  facet_grid(. ~ exon_pos  ) +
  labs(colour = "Potassium effect") +
  theme_bw() +
  theme(legend.position = "top", legend.direction = "horizontal") 
}
plot_density_binomial <- function(up_plus, up_minus, down_plus, down_minus, observations, sig){
  
  up_TOTAL <-  merge(up_plus, up_minus, by="Position")
  up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  up_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  
  
  
  up_TOTAL <- cbind(up_TOTAL, up_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
  up_TOTAL[,median:=median(PointEst)]
  up_TOTAL[, Enrrichment:=PointEst/median]
  up_TOTAL[, Enrrichment_l:=Lower/median]
  up_TOTAL[, Enrrichment_u:=Upper/median]
  up_TOTAL[, Position:=Position-1]
  
  
  down_TOTAL <-  merge(down_plus, down_minus, by="Position")
  down_TOTAL[,Occurrences:=Occurrences.x+Occurrences.y]
  
  down_TOTAL <- cbind(down_TOTAL, down_TOTAL[, binconf(Occurrences, observations, alpha=sig) ])
  down_TOTAL[,median:=median(PointEst)]
  down_TOTAL[, Enrrichment:=PointEst/median]
  down_TOTAL[, Enrrichment_l:=Lower/median]
  down_TOTAL[, Enrrichment_u:=Upper/median]
  down_TOTAL[, Position:=Position-1]  
  
  
  up_TOTAL[ ,exon_pos:="Upstream"]
  down_TOTAL[ ,exon_pos:="Downstream"]
  
  TOTAL <- rbind(up_TOTAL, down_TOTAL)
  
  TOTAL$exon_pos <-  factor(TOTAL$exon_pos, levels=c("Upstream", "Downstream" )) 
  
  p <- ggplot(TOTAL)+
    geom_line(aes(x=Position,y=Enrrichment)) +
    geom_ribbon(aes(ymin=Enrrichment_l, ymax=Enrrichment_u, x=Position), alpha=0.3 )+
    facet_grid( . ~ exon_pos ) +
    theme_bw()
  
  show(p)
  
  return(TOTAL) 
  
}
primary_cortical_neuron_DIV10_CD1.CE.NA
[1] 103907
 plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_less.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.All_G4.tsv.clean.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.All_G4.tsv.clean.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.mm10.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/SS_enrichment/plus_minus/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.mm10.txt..bed.list.out.num'

G4seq

plot_eql_diff(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num", 
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num"
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

Fig5.C <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num", 
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003539_Homo_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

Fig5.c <- Fig5.C +ylim( c(0.4, 2.1))
Fig5.c

Fig5.D <- plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_less.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
human.CE.NA,
human.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_upstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.plus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/Control_vs_KCL.diff_downstream_prob_0_9.bed.minus.score.GSM3003540_Homo_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'

Fig5.D <- Fig5.D +ylim( c(0.4, 2.1))
Fig5.D

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
ESC_derived_neuron_CD1.CE.NA,
ESC_derived_neuron_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/ESC-derived_neuron_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_CD1.CE.NA,
primary_cortical_neuron_DIV10_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV10_Tc1.CE.NA,
primary_cortical_neuron_DIV10_Tc1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV10_Tc1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003547_Mouse_all_w15_th-1_plus_minus.hits.max.K.w50.25.bed.txt..bed.list.out.num'

plot_eql_diff_binomial(
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_less.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
"~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num",
primary_cortical_neuron_DIV4_CD1.CE.NA,
primary_cortical_neuron_DIV4_CD1.CE.diff,
0.05
)
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_upstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.plus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/KCL/G4seq_enrichment/primary_cortical_neuron_DIV4_CD1.diff_downstream_prob_0_9.bed.minus.score.GSM3003548_Mouse_all_w15_th-1_plus_minus.hits.max.PDS.w50.35.bed.txt..bed.list.out.num'

smooth

rep(1:1999, each=4)
   [1]   1   1   1   1   2   2   2   2   3   3   3   3   4   4   4   4   5   5   5   5   6   6   6   6   7   7   7   7   8   8   8   8   9   9   9   9  10  10  10  10  11  11  11  11  12  12
  [47]  12  12  13  13  13  13  14  14  14  14  15  15  15  15  16  16  16  16  17  17  17  17  18  18  18  18  19  19  19  19  20  20  20  20  21  21  21  21  22  22  22  22  23  23  23  23
  [93]  24  24  24  24  25  25  25  25  26  26  26  26  27  27  27  27  28  28  28  28  29  29  29  29  30  30  30  30  31  31  31  31  32  32  32  32  33  33  33  33  34  34  34  34  35  35
 [139]  35  35  36  36  36  36  37  37  37  37  38  38  38  38  39  39  39  39  40  40  40  40  41  41  41  41  42  42  42  42  43  43  43  43  44  44  44  44  45  45  45  45  46  46  46  46
 [185]  47  47  47  47  48  48  48  48  49  49  49  49  50  50  50  50  51  51  51  51  52  52  52  52  53  53  53  53  54  54  54  54  55  55  55  55  56  56  56  56  57  57  57  57  58  58
 [231]  58  58  59  59  59  59  60  60  60  60  61  61  61  61  62  62  62  62  63  63  63  63  64  64  64  64  65  65  65  65  66  66  66  66  67  67  67  67  68  68  68  68  69  69  69  69
 [277]  70  70  70  70  71  71  71  71  72  72  72  72  73  73  73  73  74  74  74  74  75  75  75  75  76  76  76  76  77  77  77  77  78  78  78  78  79  79  79  79  80  80  80  80  81  81
 [323]  81  81  82  82  82  82  83  83  83  83  84  84  84  84  85  85  85  85  86  86  86  86  87  87  87  87  88  88  88  88  89  89  89  89  90  90  90  90  91  91  91  91  92  92  92  92
 [369]  93  93  93  93  94  94  94  94  95  95  95  95  96  96  96  96  97  97  97  97  98  98  98  98  99  99  99  99 100 100 100 100 101 101 101 101 102 102 102 102 103 103 103 103 104 104
 [415] 104 104 105 105 105 105 106 106 106 106 107 107 107 107 108 108 108 108 109 109 109 109 110 110 110 110 111 111 111 111 112 112 112 112 113 113 113 113 114 114 114 114 115 115 115 115
 [461] 116 116 116 116 117 117 117 117 118 118 118 118 119 119 119 119 120 120 120 120 121 121 121 121 122 122 122 122 123 123 123 123 124 124 124 124 125 125 125 125 126 126 126 126 127 127
 [507] 127 127 128 128 128 128 129 129 129 129 130 130 130 130 131 131 131 131 132 132 132 132 133 133 133 133 134 134 134 134 135 135 135 135 136 136 136 136 137 137 137 137 138 138 138 138
 [553] 139 139 139 139 140 140 140 140 141 141 141 141 142 142 142 142 143 143 143 143 144 144 144 144 145 145 145 145 146 146 146 146 147 147 147 147 148 148 148 148 149 149 149 149 150 150
 [599] 150 150 151 151 151 151 152 152 152 152 153 153 153 153 154 154 154 154 155 155 155 155 156 156 156 156 157 157 157 157 158 158 158 158 159 159 159 159 160 160 160 160 161 161 161 161
 [645] 162 162 162 162 163 163 163 163 164 164 164 164 165 165 165 165 166 166 166 166 167 167 167 167 168 168 168 168 169 169 169 169 170 170 170 170 171 171 171 171 172 172 172 172 173 173
 [691] 173 173 174 174 174 174 175 175 175 175 176 176 176 176 177 177 177 177 178 178 178 178 179 179 179 179 180 180 180 180 181 181 181 181 182 182 182 182 183 183 183 183 184 184 184 184
 [737] 185 185 185 185 186 186 186 186 187 187 187 187 188 188 188 188 189 189 189 189 190 190 190 190 191 191 191 191 192 192 192 192 193 193 193 193 194 194 194 194 195 195 195 195 196 196
 [783] 196 196 197 197 197 197 198 198 198 198 199 199 199 199 200 200 200 200 201 201 201 201 202 202 202 202 203 203 203 203 204 204 204 204 205 205 205 205 206 206 206 206 207 207 207 207
 [829] 208 208 208 208 209 209 209 209 210 210 210 210 211 211 211 211 212 212 212 212 213 213 213 213 214 214 214 214 215 215 215 215 216 216 216 216 217 217 217 217 218 218 218 218 219 219
 [875] 219 219 220 220 220 220 221 221 221 221 222 222 222 222 223 223 223 223 224 224 224 224 225 225 225 225 226 226 226 226 227 227 227 227 228 228 228 228 229 229 229 229 230 230 230 230
 [921] 231 231 231 231 232 232 232 232 233 233 233 233 234 234 234 234 235 235 235 235 236 236 236 236 237 237 237 237 238 238 238 238 239 239 239 239 240 240 240 240 241 241 241 241 242 242
 [967] 242 242 243 243 243 243 244 244 244 244 245 245 245 245 246 246 246 246 247 247 247 247 248 248 248 248 249 249 249 249 250 250 250 250
 [ reached getOption("max.print") -- omitted 6996 entries ]
diff_eql.TOTAL[ , bin:=rep(1:1999, each=4) ]
diff_eql.TOTAL[, mean_Enrrichment:=mean(Enrrichment) , by=bin]
ggplot(diff_eql.TOTAL) +
  geom_line(aes(x=Position, y=mean_Enrrichment, color=type)) +
  xlim(c(-250,250)) +
  facet_grid(. ~ exon_pos  ) +
  labs(colour = "Potassium effect") +
  theme_bw() +
  theme(legend.position = "top", legend.direction = "horizontal") 

Intron lenght

ks.test(intron_size[G4>0, intron_size], intron_size[G4==0, intron_size])
p-value will be approximate in the presence of ties

    Two-sample Kolmogorov-Smirnov test

data:  intron_size[G4 > 0, intron_size] and intron_size[G4 == 0, intron_size]
D = 0.25781, p-value < 2.2e-16
alternative hypothesis: two-sided
size_int <- c(seq(0,5000,10), c(10000, 100000, 1000000, 10000000))
intron_size$int_count <- cut(intron_size$intron_size, size_int)
int_counts_up_w_G4 <- table(intron_size[pos=="Upstream intron" & G4>0, ]$int_count)
int_counts_up_wo_G4 <- table(intron_size[pos=="Upstream intron" & G4==0, ]$int_count)
int_counts_up <- rbind(int_counts_up_w_G4, int_counts_up_wo_G4)
colnames(int_counts_up) <- c(seq(10,5000,10), c(10000, 100000, 1000000, 10000000))
int_counts_up <- melt(int_counts_up)
int_counts_down_w_G4 <- table(intron_size[pos=="Downstream intron" & G4>0, ]$int_count)
int_counts_down_wo_G4 <- table(intron_size[pos=="Downstream intron" & G4==0, ]$int_count)
int_counts_down <- rbind(int_counts_down_w_G4, int_counts_down_wo_G4)
colnames(int_counts_down) <- c(seq(10,5000,10), c(10000, 100000, 1000000, 10000000))
int_counts_down <- melt(int_counts_down)
intron_size_ints <- rbind(int_counts_up, int_counts_down)
colnames(intron_size_ints) <- c("factor", "int", "count")
intron_size_ints <- data.table(intron_size_ints)
intron_size_ints[ , total:=sum(count) , by="factor" ]
intron_size_ints[ , frac:=(count/total) ]
intron_size_ints_up <- merge(intron_size_ints[ factor=="int_counts_up_w_G4", ], intron_size_ints[ factor=="int_counts_up_wo_G4", ], by="int" )
intron_size_ints_up[ , relative_frac:=frac.x/frac.y ]
intron_size_ints_down <- merge(intron_size_ints[ factor=="int_counts_down_w_G4", ], intron_size_ints[ factor=="int_counts_down_wo_G4", ], by="int" )
intron_size_ints_down[ , relative_frac:=frac.x/frac.y ]
intron_size_ints_up[, pos:="Upstream intron"]
intron_size_ints_down[, pos:="Downstream intron"]
intron_size_ints_total <- rbind(intron_size_ints_up, intron_size_ints_down)
intron_size_ints_total$pos <- factor(intron_size_ints_total$pos, level=c("Upstream intron", "Downstream intron"))
Fig3.C <- ggplot(intron_size_ints_total, aes(int, log2(relative_frac))  ) +
  geom_hline(yintercept=0, linetype="dashed") +
  geom_point() +
  stat_smooth( method = "lm", formula = y ~ poly(x, 8)) +
  xlim(c(0, 2000)) +
  ylim(c(-2,2)) +
  facet_grid(. ~ pos)
Fig3.C

intron_size_ints_total[ relative_frac %in% intron_size_ints_total[, max(relative_frac), by=pos]$V1, ]
   int             factor.x count.x total.x      frac.x              factor.y count.y total.y       frac.y relative_frac               pos
1:  70   int_counts_up_w_G4     150   61795 0.002427381   int_counts_up_wo_G4     509  651213 0.0007816183      3.105583   Upstream intron
2:  70 int_counts_down_w_G4     150   42311 0.003545177 int_counts_down_wo_G4     509  670697 0.0007589120      4.671395 Downstream intron
 Upstream_U2_score_len <- fread("./Figures/Figure3/Upstream_U2_score_len_matrix.txt2.old")
 Downstream_U2_score_len <- fread("./Figures/Figure3/Downstream_U2_score_len_matrix.txt2.old")
 
 
 Upstream_U2_score_len <-data.table::melt(Upstream_U2_score_len, id.vars='IL')
Downstream_U2_score_len <- data.table::melt(Downstream_U2_score_len, id.vars='IL')
Upstream_U2_score_len[, pos:="Upstream intron"]
Downstream_U2_score_len[, pos:="Downstream intron"]
 
Fig3.D1 <-  ggplot(Upstream_U2_score_len) +
   geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
   scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
   facet_grid(. ~ pos) +
    theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
 
 
Fig3.D2 <-  ggplot(Downstream_U2_score_len) +
   geom_tile( aes(variable, as.factor(IL), fill = value*100)) +
   scale_fill_gradient2(low="blue", high="red", mid = "grey", midpoint = 12.5, limits = c(0, 25)) +
   facet_grid(. ~ pos) +
    theme(legend.position = "bottom", legend.direction = "horizontal") +
      theme(legend.position = "bottom", legend.direction = "horizontal") + theme(axis.text.x = element_text(angle = 90)) +labs(x = NULL, y = NULL)
Fig3.D <- plot_grid(Fig3.D1, Fig3.D2)
 Fig3.D

closest_g4 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ ,  dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ ,  dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ ,  dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "gscore", "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ ,  dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus) 
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
exon.up.motif <- fread("./Figures/Figure1/exons.up.closest_G4_clean")
colnames(exon.up.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.up.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.up.motif[  strand=="+"  ,  dist:=gmid - estart]
exon.up.motif[  strand=="-"  ,  dist:= estart - gmid]
exon.down.motif <- fread("./Figures/Figure1/exons.down.closest_G4_clean")
colnames(exon.down.motif) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend")
exon.down.motif[ , gmid:= gstart + (gend-gstart)/2]
exon.down.motif[  strand=="+"  ,  dist:=gmid - estart]
exon.down.motif[  strand=="-"  ,  dist:= estart - gmid]
exon.up.motif[, pos:="3'Splice site"]
exon.down.motif[, pos:="5'Splice site"]
exon.dist.motif <- rbind(exon.up.motif, exon.down.motif)
ggplot(exon.dist.motif) +
  geom_density(aes(dist)) +
  xlim(c(-1000, 1000)) +
  facet_grid(. ~ pos)

NA
Fig1.B + xlim(c(-300, 300))
Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

closest_g4_2015 <- function(dist.exon_up_plus_path, dist.exon_up_minus_path, dist.exon_down_plus_path, dist.exon_down_minus_path){
dist.exon_up_plus <- fread(dist.exon_up_plus_path)
colnames(dist.exon_up_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend", "exon_dist")
dist.exon_up_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_plus[ ,  dist:=gmid - estart]
dist.exon_up_minus <- fread(dist.exon_up_minus_path)
colnames(dist.exon_up_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend",  "exon_dist")
dist.exon_up_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_up_minus[ ,  dist:= estart - gmid]
dist.exon_down_plus <- fread(dist.exon_down_plus_path)
colnames(dist.exon_down_plus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend",  "exon_dist")
dist.exon_down_plus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_plus[ ,  dist:=gmid - estart]
dist.exon_down_minus <- fread(dist.exon_down_minus_path)
colnames(dist.exon_down_minus) <- c("echrom", "estart", "eend", "exon", "cero", "strand", "gchrom", "gstart", "gend",  "exon_dist")
dist.exon_down_minus[, gmid:= gstart + (gend-gstart)/2]
dist.exon_down_minus[ ,  dist:= estart - gmid]
dist.exon_up <- rbind(dist.exon_up_plus, dist.exon_up_minus) 
dist.exon_down <- rbind(dist.exon_down_plus, dist.exon_down_minus)
dist.exon_up[, pos:="3'Splice site"]
dist.exon_down[, pos:="5'Splice site"]
dist.exon <- rbind(dist.exon_up, dist.exon_down)
return(dist.exon)
}
closest_g4_KCL_2015 <- closest_g4_2015("./Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
closest_g4_PDS_2015 <- closest_g4_2015("./Figures/Figure1/exon_up_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_up_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_down_plus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed",
                             "Figures/Figure1/exon_down_minus.hg19.closest.GSE63874_Na_PDS_plus_minus_hits_intersect.bed")
closest_g4_KCL_2015[, Type:="G4-seq Na+ K+"]
closest_g4_PDS_2015[, Type:="G4-seq Na+ PDS"]
closest_g4_KCL_2015 <- unique(closest_g4_KCL_2015[ , c("echrom", "estart", "eend", "dist", "pos", "Type")])
closest_g4_PDS_2015 <- unique(closest_g4_PDS_2015[ , c("echrom", "estart", "eend", "dist", "pos",  "Type")])
closest_g4_KCL_PDS_2015 <- rbind(closest_g4_KCL_2015, closest_g4_PDS_2015)
ggplot(closest_g4_KCL_PDS_2015) +
  geom_line(aes(dist, colour=Type), bw=10, stat="density") +
  xlim(c(-1000, 1000)) +
  facet_grid(Type ~ pos) +
  xlab("Distance") +
  ylab("Density") +
  theme_bw() +
  theme(legend.position = "top", legend.direction = "horizontal")  + 
    theme(axis.text.x = element_text( angle = 45)) 

closest_g4.TOTAL.1kb <- closest_g4.TOTAL[abs(dist)<=1000 , ]
closest_g4.TOTAL.1kb[, bin:=cut(dist, seq(-1000, 1000, 5), labels= seq(-995, 1000, 5) ) ]
closest_g4.TOTAL.1kb.enrichment <- closest_g4.TOTAL.1kb[ , .(Occurrences=.N) , by=c("bin", "pos", "Treatment", "Species")]
closest_g4.TOTAL.1kb.enrichment.median <-  closest_g4.TOTAL.1kb.enrichment[, .(median=median(Occurrences)), by=c( "pos", "Treatment", "Species") ]
closest_g4.TOTAL.1kb.enrichment <- merge(closest_g4.TOTAL.1kb.enrichment, closest_g4.TOTAL.1kb.enrichment.median, by=c( "pos", "Treatment", "Species")) 
closest_g4.TOTAL.1kb.enrichment[, Enrrichment:=Occurrences/median]
closest_g4.TOTAL.1kb.enrichment[ , bin:=as.numeric(as.character(bin))]
Fig6.D <- ggplot(closest_g4.TOTAL.1kb.enrichment) +
  geom_line(aes(bin, Enrrichment, colour=Species)) +
  xlim(c(-1000, 1000)) +
  facet_grid(Treatment ~ pos) +
  xlab("Distance") +
  ylab("Enrichment") +
  theme_bw() +
  theme(legend.position = "top", legend.direction = "horizontal")  + 
  theme(axis.text.x = element_text(vjust = 0.7, 
    angle = 45)) 
Fig6.D

read_dist_table_plus_minus <- function(path.plus, path.minus ){
  
dist_table.plus <- data.table(read_delim(path.plus, 
    "\t", escape_double = FALSE, col_names = FALSE, 
    trim_ws = TRUE))
dist_table.plus <- dist_table.plus[, 2:2001]
dist_table.plus <- data.table(as.data.frame(t(dist_table.plus)))
colnames(dist_table.plus) <- c("Position", "Occurrences")
dist_table.minus <- data.table(read_delim(path.minus, 
    "\t", escape_double = FALSE, col_names = FALSE, 
    trim_ws = TRUE))
dist_table.minus <- dist_table.minus[, 2:2001]
dist_table.minus <- data.table(as.data.frame(t(dist_table.minus)))
colnames(dist_table.minus) <- c("Position", "Occurrences")
 
dist_table <-  merge(dist_table.plus, dist_table.minus, by="Position")
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table[, Occurrences:=(Occurrences.x + Occurrences.y)]
dist_table <- dist_table[, c("Position", "Occurrences")]
dist_table[,median:=median(Occurrences)]
dist_table[, Enrrichment:=Occurrences/median]
dist_table[, Position:=Position-1]
return(dist_table)  
}
enrichment_G4_seq_plot <- function(path.up_plus.plus, path.up_plus.minus, 
                                   path.down_plus.plus, path.down_plus.minus, 
                                   path.up_minus.plus, path.up_minus.minus,
                                   path.down_minus.plus, path.down_minus.minus ){
x.up_plus <- read_dist_table_plus_minus(path.up_plus.plus,
                           path.up_plus.minus)
x.down_plus <- read_dist_table_plus_minus(path.down_plus.plus,
                           path.down_plus.minus)
x.up_minus <- read_dist_table_plus_minus(path.up_minus.plus,
                           path.up_minus.minus)
x.down_minus <- read_dist_table_plus_minus(path.down_minus.plus,
                          path.down_minus.minus)
x.up_minus[,Position:=Position*-1]
x.down_minus[,Position:=Position*-1]
x.TOTAL <- plot_density(x.up_plus, x.up_minus, x.down_plus, x.down_minus)
return(x.TOTAL)
}
hg19.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003539_Homo_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

hg19.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.hg19.score.GSM3003540_Homo_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

sacCer3.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003553_Saccaromyces_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

sacCer3.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.sacCer3.score.GSM3003554_Saccaromyces_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

mouse.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003547_Mouse_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

mouse.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                              file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.mm10.score.GSM3003548_Mouse_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

 
dm6.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                               file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003541_Drosophila_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

dm6.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                 file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                  file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.dm6.score.GSM3003542_Drosophila_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

tair10.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003535_Arabidopsis_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

tair10.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.bed_tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                          file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                           file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                            file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                             file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.bed.tair10.score.GSM3003536_Arabidopsis_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

danRer10.TOTAL.KCL <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                   file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                    file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_plus.hits.max.K.w50.25.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003557_Zebrafish_all_w15_th-1_minus.hits.max.K.w50.25.bed.txt..num'

danRer10.TOTAL.PDS <- enrichment_G4_seq_plot("~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num",
                       
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num",
                       "~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num")
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                     file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_plus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                      file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                       file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_up_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                        file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_plus.hits.max.PDS.w50.35.bed.txt..num'
Parsed with column specification:
cols(
  .default = col_double()
)
See spec(...) for full column specifications.
1 parsing failure.
row col     expected       actual                                                                                                                                                         file
  2  -- 2001 columns 2002 columns '~/Google_Drive/Results/Non_B/G4_seq_2019/Evolution/exon_down_minus.danRer10.score.GSM3003558_Zebrafish_all_w15_th-1_minus.hits.max.PDS.w50.35.bed.txt..num'

hg19.TOTAL.KCL[, Treatment:="KCl"] 
hg19.TOTAL.PDS[, Treatment:="PDS"]
hg19.TOTAL.KCL[, Species:="H. sapiens"] 
hg19.TOTAL.PDS[, Species:="H. sapiens"]  
sacCer3.TOTAL.KCL[, Treatment:="KCl"]  
sacCer3.TOTAL.PDS[, Treatment:="PDS"]
sacCer3.TOTAL.KCL[, Species:="S. cerevisiae"]  
sacCer3.TOTAL.PDS[, Species:="S. cerevisiae"]  
mouse.TOTAL.KCL[, Treatment:="KCl"]  
mouse.TOTAL.PDS[, Treatment:="PDS"] 
mouse.TOTAL.KCL[, Species:="M. musculus"]  
mouse.TOTAL.PDS[, Species:="M. musculus"]  
dm6.TOTAL.KCL[, Treatment:="KCl"]  
dm6.TOTAL.PDS[, Treatment:="PDS"]
dm6.TOTAL.KCL[, Species:="D. melanogaster"]  
dm6.TOTAL.PDS[, Species:="D. melanogaster"]  
tair10.TOTAL.KCL[, Treatment:="KCl"] 
tair10.TOTAL.PDS[, Treatment:="PDS"] 
tair10.TOTAL.KCL[, Species:="A. thaliana"] 
tair10.TOTAL.PDS[, Species:="A. thaliana"] 
danRer10.TOTAL.KCL[, Treatment:="KCl"]  
danRer10.TOTAL.PDS[, Treatment:="PDS"]
danRer10.TOTAL.KCL[, Species:="D. rerio"]  
danRer10.TOTAL.PDS[, Species:="D. rerio"]
TOTAL.KCL_PDS <-  rbind(hg19.TOTAL.KCL, hg19.TOTAL.PDS, sacCer3.TOTAL.KCL, sacCer3.TOTAL.PDS, mouse.TOTAL.KCL, mouse.TOTAL.PDS, dm6.TOTAL.KCL, dm6.TOTAL.PDS, tair10.TOTAL.KCL, tair10.TOTAL.PDS, danRer10.TOTAL.KCL, danRer10.TOTAL.PDS)
ggplot(TOTAL.KCL_PDS) +
  geom_line(aes(Position, Enrrichment, colour=Species)) +
  xlim(c(-1000, 1000)) +
  facet_grid(Treatment ~ exon_pos) +
  xlab("Distance") +
  ylab("Enrichment") +
  theme_bw() +
  theme(legend.position = "top", legend.direction = "horizontal")  + 
  theme(axis.text.x = element_text(vjust = 0.7, 
    angle = 45)) 

closest_g4_KCL.hg19.2015 <- closest_g4("./Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")


closest_g4_KCL.hg19.2015 <- closest_g4("./Figures/Supplementary/exon_up_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_up_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_down_plus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed",
                             "Figures/Supplementary/exon_down_minus.hg19.closest.GSE63874_Na_K_plus_minus_hits_intersect.bed")
KCL_up <- unique(closest_g4_KCL[abs(dist)>=100 & pos=="3'Splice site", paste(echrom, estart, eend, sep = "_")])
gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(3)
[1] "#F8766D" "#00BA38" "#619CFF"
 library(eulerr)
VennDiag.up <- euler(c("Motif" = 8807+9325,  
                    "K" = 9653+10029,  
                    "PDS" = 34880+36909, 
                    "K&PDS" = 9890+9539,
                    "PDS&Motif" = 8331+8855,
                    "K&Motif" = 4509+4749,
                    "K&PDS&Motif" = 4503+4747))
Fig1.C1 <- plot(VennDiag.up, counts = TRUE, font=2, cex=1, alpha=0.5,
     fill=gg_color_hue(3), quantities = list(fontsize = 10))
VennDiag.down <- euler(c("Motif" = 9507+10142,  
                    "K" = 10120+9365,  
                    "PDS" = 34844+36737, 
                    "K&PDS" = 9236+9985,
                    "PDS&Motif" = 8973+9593,
                    "K&Motif" = 4806+5221,
                    "K&PDS&Motif" = 4802+5211))
Fig1.C2 <- plot(VennDiag.down, counts = TRUE, font=1, cex=1, alpha=0.5,
     fill=gg_color_hue(3),  quantities = list(fontsize = 10))
Fig1.C <- plot_grid(Fig1.C1, Fig1.C2, nrow=1)
Fig1.C

VennDiag.up_2015 <- euler(c("Motif" = 18132,  
                    "K" = 34761,  
                    "PDS" = 50894, 
                    "K&PDS" = 31711,
                    "PDS&Motif" = 14786,
                    "K&Motif" = 11794,
                    "K&PDS&Motif" = 11250))
venn_supp.up <- plot(VennDiag.up_2015, counts = TRUE, font=2, cex=1, alpha=0.5,
     fill=gg_color_hue(3), quantities = list(fontsize = 10))
VennDiag.down_2015 <- euler(c("Motif" = 19649,  
                    "K" = 33908,  
                    "PDS" = 49806, 
                    "K&PDS" = 30920,
                    "PDS&Motif" = 15951,
                    "K&Motif" = 12615,
                    "K&PDS&Motif" = 12027))
venn_supp.down <- plot(VennDiag.down_2015, counts = TRUE, font=1, cex=1, alpha=0.5,
     fill=gg_color_hue(3),  quantities = list(fontsize = 10))
plot_grid(venn_supp.up, venn_supp.down, labels = c("3' Splice site", "5' Splice site"))

dataframe_G4_consensus_motif_enrichment_species <- fread("./Figures/Figure1/dataframe_G4_consensus_motif_enrichment_species")
dataframe_G4_consensus_motif_enrichment_species_matrix <- t(dataframe_G4_consensus_motif_enrichment_species)
header <- as.character(head(dataframe_G4_consensus_motif_enrichment_species_matrix, 1))
dataframe_G4_consensus_motif_enrichment_species_df <- as.data.frame(tail(dataframe_G4_consensus_motif_enrichment_species_matrix, -1))
colnames(dataframe_G4_consensus_motif_enrichment_species_df) <- header
dataframe_G4_consensus_motif_enrichment_species_df$specie <- rownames(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt <- data.table(dataframe_G4_consensus_motif_enrichment_species_df)
dataframe_G4_consensus_motif_enrichment_species_dt$median <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$median))
dataframe_G4_consensus_motif_enrichment_species_dt$st.dev <- as.numeric(as.character(dataframe_G4_consensus_motif_enrichment_species_dt$st.dev))
dataframe_G4_consensus_motif_enrichment_species_dt$specie <- factor(dataframe_G4_consensus_motif_enrichment_species_dt$specie , levels=dataframe_G4_consensus_motif_enrichment_species_dt[order(-median)]$specie)
Fig6.A <- ggplot(dataframe_G4_consensus_motif_enrichment_species_dt, aes(x = specie, y=median) ) +
  geom_bar( stat="identity", colour="black", fill="white") +
  geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="red" , width=0.2) +
  theme_bw()+
  xlab("Species") +
  ylab("Density (G4s / kB)") +
  theme(axis.text.x = element_text(vjust = 0.7, 
    angle = 45))
Fig6.A

dataframe_evo_PDS_K <- fread("./Figures/Figure1/dataframe_evo_PDS_K")
dataframe_evo_PDS_K_matrix <- t(dataframe_evo_PDS_K)
header <- as.character(head(dataframe_evo_PDS_K_matrix, 1))
dataframe_evo_PDS_K_df <- as.data.frame(tail(dataframe_evo_PDS_K_matrix, -1))
colnames(dataframe_evo_PDS_K_df) <- header
dataframe_evo_PDS_K_df$Species <- rownames(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt <- data.table(dataframe_evo_PDS_K_df)
dataframe_evo_PDS_K_dt_nice <- rbind(dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="K+", median=K_median, st.dev=K_st.dev  )  ],
dataframe_evo_PDS_K_dt[ , .(Species=Species, Treatment="PDS", median=PDS_median, st.dev=PDS_st.dev  )  ])
dataframe_evo_PDS_K_dt_nice$median <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$median))
dataframe_evo_PDS_K_dt_nice$st.dev <- as.numeric(as.character(dataframe_evo_PDS_K_dt_nice$st.dev))
ggplot(dataframe_evo_PDS_K_dt_nice, aes(x = Species, y=median, group=Treatment)) +
  geom_bar( aes(colour=Treatment ), stat="identity", fill="white", position="dodge") +
  geom_errorbar(aes(ymin = (median - st.dev), ymax = (as.numeric(median) + as.numeric(st.dev))), colour="black" , width=0.2,  position = position_dodge()) +
  theme_bw()+
  xlab("Species") +
  ylab("Density (G4s / kB)") +
  theme(axis.text.x = element_text(vjust = 0.7, 
    angle = 45))

dataframe_evo_PDS_K_dt_nice$Species <- factor(dataframe_evo_PDS_K_dt_nice$Species , levels=dataframe_evo_PDS_K_dt_nice[Treatment=="PDS"][order(-median)]$Species)
Fig6.C <-  ggplot(dataframe_evo_PDS_K_dt_nice, aes(x=Species, weight=median, ymin=median-st.dev, ymax=median+st.dev, group=Treatment)) +
     geom_bar(position=position_dodge(), aes(y=median, color=Treatment), fill="white", stat="identity") +
     geom_errorbar (position=position_dodge(width=0.9), colour="black", width=0.2) +
    theme_bw()+
  xlab("Species") +
  ylab("Density (G4s / kB)") +
  theme(axis.text.x = element_text(vjust = 0.7, 
    angle = 45))
Fig6.C

dataframe_evo_PDS_K_dt_nice
Figures
Fig1.BC <- plot_grid(Fig1.B, Fig1.C, ncol=1, labels = c("B", "C"), rel_heights = c(2, 1))
Removed 689382 rows containing non-finite values (stat_density).
Fig1 <- plot_grid(Fig1.A, Fig1.BC, nrow=1, labels = c("A", ""))
Removed 1398 rows containing missing values (geom_path).
Fig1

Fig2 <- plot_grid(Fig2.A, Fig2.B,ncol = 1 , labels ="AUTO", rel_heights = c(1.5, 1))
Removed 6792 rows containing missing values (geom_path).Removed 10788 rows containing missing values (geom_path).
Fig2

Fig3 <- plot_grid(Fig3.A, Fig3.B, Fig3.C, Fig3.D, labels = "AUTO", ncol=2)
Removed 330326 rows containing non-finite values (stat_density).Removed 610 rows containing non-finite values (stat_smooth).Removed 610 rows containing missing values (geom_point).
Fig3

Fig5.bottom <- plot_grid(Fig5.A, Fig5.B, Fig5.C, Fig5.D, nrow = 2, ncol = 2 , labels = c("B", "C", "D", "E"), rel_heights = c(1, 1, 1, 1))
Removed 2996 rows containing missing values (geom_path).Removed 2996 rows containing missing values (geom_path).
Fig5 <- plot_grid(Fig5.A1, Fig5.bottom, nrow=2, labels = c("A", ""),  rel_heights = c(2, 4))
Fig5

Fig6.top <- plot_grid(Fig6.A, Fig6.C, labels = c("A", "C"))
Fig6.bottom <- plot_grid(Fig6.B, Fig6.D, labels = c("B", "D"))
Removed 9786 rows containing missing values (geom_path).Removed 4 rows containing missing values (geom_path).
Fig6 <- plot_grid(Fig6.A, Fig6.C, Fig6.B , Fig6.D, labels = c("A", "C", "B", "D") , ncol=2, rel_heights = c(1, 1, 3, 3))
Removed 9786 rows containing missing values (geom_path).Removed 4 rows containing missing values (geom_path).
Fig6 <- plot_grid(Fig6.top, Fig6.bottom, rel_heights = c(1, 1.5), nrow=2)
Fig6

LS0tCnRpdGxlOiAiR2Vvcmdha29wb3Vsb3VzLXNvYXJlcyBhbmQgUGFyYWRhIGV0LiBhbCAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgoKCiMgTm9uLUIgRE5BIHN0cnVjdHVyZXMgYWNyb3NzIHNwbGljZS1zaXRlcwoKClRvIGludmVzdGlnYXRlIGlmIG5vbi1CIEROQSBzdHJ1Y3R1cmVzIGNhbiBhZmZlY3Qgc3BsaWNpbmcsIHdlIGV4cGxvcmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkaWZmZXJlbnQgbW90aWZzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBOb24tQiBETkEgc3RydWN0dXJlcy4gV2UgY2FsY3VsYXRlZCB0aGUgbnVtYmVyIG9mIHRoZXNlIG1vdGlmcyB0aGF0IGNhbiBiZSBmb3VuZCBhY3Jvc3Mgc3BsaWNlIHNpdGVzICgubnVtIGZpbGVzKSBhbmQgdGhlbiB3ZSBjYWxjdWxhdGVkIHRoZSBwb3NpdGlvbmFsIGVucmljaG1lbnQgb2YgdGhlc2UgYWNyb3NzIHNwbGljZSBzaXRlcy4gCgoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoSG1pc2MpCgoKYGBgCgoKT24gdGhpcyByZXBvcnQgd2UgY29tcGlsZSBhbGwgdGhlIGRhdGEgYW5hbHlzaXMgdGhhdCBsZWFkIHVzIHRvIGdldCB0aGUgZmluYWwgZmlndXJlcy4gRm9yIHRoaXMsIHdlIHByb2Nlc3NlZCBzZXZlcmFsICBhCgpgYGB7cn0KCgoKcmVhZF9kaXN0X3RhYmxlIDwtIGZ1bmN0aW9uKHBhdGgpewogIApkaXN0X3RhYmxlIDwtIGRhdGEudGFibGUocmVhZF9kZWxpbShwYXRoLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpKQoKZGlzdF90YWJsZSA8LSBkaXN0X3RhYmxlWywgMjoyMDAxXQpkaXN0X3RhYmxlIDwtIGRhdGEudGFibGUoYXMuZGF0YS5mcmFtZSh0KGRpc3RfdGFibGUpKSkKY29sbmFtZXMoZGlzdF90YWJsZSkgPC0gYygiUG9zaXRpb24iLCAiT2NjdXJyZW5jZXMiKQoKZGlzdF90YWJsZVssbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpXQpkaXN0X3RhYmxlWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KZGlzdF90YWJsZVssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQoKcmV0dXJuKGRpc3RfdGFibGUpICAKfQoKCmBgYAoKCgoKYGBge3J9CgpwbG90X2RlbnNpdHkgPC0gZnVuY3Rpb24odXBfcGx1cywgdXBfbWludXMsIGRvd25fcGx1cywgZG93bl9taW51cyl7CgogIAogIHVwX1RPVEFMIDwtICBtZXJnZSh1cF9wbHVzLCB1cF9taW51cywgYnk9IlBvc2l0aW9uIikKICB1cF9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KICB1cF9UT1RBTFssbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpXQogIHVwX1RPVEFMWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KICB1cF9UT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQogIAogIAogIGRvd25fVE9UQUwgPC0gIG1lcmdlKGRvd25fcGx1cywgZG93bl9taW51cywgYnk9IlBvc2l0aW9uIikKICBkb3duX1RPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQogIGRvd25fVE9UQUxbLG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKV0KICBkb3duX1RPVEFMWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KICBkb3duX1RPVEFMWywgUG9zaXRpb246PVBvc2l0aW9uLTFdCiAgCiAgdXBfVE9UQUxbICxleG9uX3Bvczo9IlVwc3RyZWFtIl0KICBkb3duX1RPVEFMWyAsZXhvbl9wb3M6PSJEb3duc3RyZWFtIl0KICAKICBUT1RBTCA8LSByYmluZCh1cF9UT1RBTCwgZG93bl9UT1RBTCkKICAKICBUT1RBTCRleG9uX3BvcyA8LSAgZmFjdG9yKFRPVEFMJGV4b25fcG9zLCBsZXZlbHM9YygiVXBzdHJlYW0iLCAiRG93bnN0cmVhbSIgKSkgCiAgCiAgcCA8LSBnZ3Bsb3QoVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgICB0aGVtZV9idygpCiAgCiAgc2hvdyhwKQogIAogIFRPVEFMCiAgCiAgCgp9CmBgYAoKCgpgYGB7cn0KCgpwbG90X2RlbnNpdHlfYmlub21pYWwgPC0gZnVuY3Rpb24odXBfcGx1cywgdXBfbWludXMsIGRvd25fcGx1cywgZG93bl9taW51cywgb2JzZXJ2YXRpb25zLCBzaWcpewoKICAKICB1cF9UT1RBTCA8LSAgbWVyZ2UodXBfcGx1cywgdXBfbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgdXBfVE9UQUxbLE9jY3VycmVuY2VzOj1PY2N1cnJlbmNlcy54K09jY3VycmVuY2VzLnldCiAgdXBfVE9UQUxbLE9jY3VycmVuY2VzOj1PY2N1cnJlbmNlcy54K09jY3VycmVuY2VzLnldCiAgCgogIAogIAogIHVwX1RPVEFMIDwtIGNiaW5kKHVwX1RPVEFMLCB1cF9UT1RBTFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIG9ic2VydmF0aW9ucywgYWxwaGE9c2lnKSBdKQoKICB1cF9UT1RBTFssbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpXQogIHVwX1RPVEFMWywgRW5ycmljaG1lbnQ6PVBvaW50RXN0L21lZGlhbl0KICB1cF9UT1RBTFssIEVucnJpY2htZW50X2w6PUxvd2VyL21lZGlhbl0KICB1cF9UT1RBTFssIEVucnJpY2htZW50X3U6PVVwcGVyL21lZGlhbl0KICB1cF9UT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQoKICAKICAKICBkb3duX1RPVEFMIDwtICBtZXJnZShkb3duX3BsdXMsIGRvd25fbWludXMsIGJ5PSJQb3NpdGlvbiIpCiAgZG93bl9UT1RBTFssT2NjdXJyZW5jZXM6PU9jY3VycmVuY2VzLngrT2NjdXJyZW5jZXMueV0KCiAgCiAgZG93bl9UT1RBTCA8LSBjYmluZChkb3duX1RPVEFMLCBkb3duX1RPVEFMWywgYmluY29uZihPY2N1cnJlbmNlcywgb2JzZXJ2YXRpb25zLCBhbHBoYT1zaWcpIF0pCgogIGRvd25fVE9UQUxbLG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KV0KICBkb3duX1RPVEFMWywgRW5ycmljaG1lbnQ6PVBvaW50RXN0L21lZGlhbl0KICBkb3duX1RPVEFMWywgRW5ycmljaG1lbnRfbDo9TG93ZXIvbWVkaWFuXQogIGRvd25fVE9UQUxbLCBFbnJyaWNobWVudF91Oj1VcHBlci9tZWRpYW5dCiAgZG93bl9UT1RBTFssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXSAgCiAgCiAgCiAgdXBfVE9UQUxbICxleG9uX3Bvczo9IlVwc3RyZWFtIl0KICBkb3duX1RPVEFMWyAsZXhvbl9wb3M6PSJEb3duc3RyZWFtIl0KICAKICBUT1RBTCA8LSByYmluZCh1cF9UT1RBTCwgZG93bl9UT1RBTCkKICAKICBUT1RBTCRleG9uX3BvcyA8LSAgZmFjdG9yKFRPVEFMJGV4b25fcG9zLCBsZXZlbHM9YygiVXBzdHJlYW0iLCAiRG93bnN0cmVhbSIgKSkgCiAgCiAgcCA8LSBnZ3Bsb3QoVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UsIHg9UG9zaXRpb24pLCBhbHBoYT0wLjMgKSsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICAgIHRoZW1lX2J3KCkKICAKICBzaG93KHApCiAgCiAgcmV0dXJuKFRPVEFMKSAKICAKfQpgYGAKCgoKIyMgRy1RdWFkcnVwbGV4ZXMKCmBgYHtyfQoKRzQudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9HNC5leG9uLnVwX3BsdXMubGlzdC5vdXQubnVtIikKRzQuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0c0LmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCkc0LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0c0LmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKRzQuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9HNC5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKRzQudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KRzQuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKRzQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KEc0LnVwX3BsdXMsIEc0LnVwX21pbnVzLCBHNC5kb3duX3BsdXMsIEc0LmRvd25fbWludXMpIAoKYGBgCgoKIyMgRGlyZWN0ZWQgcmVwZWF0cwoKCmBgYHtyfQoKRFIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9EUi5leG9uLnVwX3BsdXMubGlzdC5vdXQubnVtIikKRFIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0RSLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCkRSLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0RSLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKRFIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9EUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKRFIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KRFIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCkRSLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShEUi51cF9wbHVzLCBEUi51cF9taW51cywgRFIuZG93bl9wbHVzLCBEUi5kb3duX21pbnVzKQoKYGBgCgoKIyMgSC1ETkEKCgpgYGB7cn0KCkhfRE5BLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvSF9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9IX0ROQS5leG9uLmRvd25fcGx1cy5saXN0Lm91dC5udW0iKQpIX0ROQS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9IX0ROQS5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvSF9ETkEuZXhvbi5kb3duX21pbnVzLmxpc3Qub3V0Lm51bSIpCkhfRE5BLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCkhfRE5BLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpIX0ROQS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoSF9ETkEudXBfcGx1cywgSF9ETkEudXBfbWludXMsIEhfRE5BLmRvd25fcGx1cywgSF9ETkEuZG93bl9taW51cykKCmBgYAoKCiMjIEludmVydGVkIHJlcGVhdAoKCmBgYHtyfQoKSVIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9JUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSVIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0lSLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpCklSLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL0lSLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKSVIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9JUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKSVIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KSVIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCklSLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShJUi51cF9wbHVzLCBJUi51cF9taW51cywgSVIuZG93bl9wbHVzLCBJUi5kb3duX21pbnVzKQoKYGBgCgoKIyMgTWlycm9yIHJlcGVhdAoKYGBge3J9CgpNUi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL01SLmV4b24uZG93bl9taW51cy5saXN0Lm91dC5udW0iKQpNUi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvTVIuZXhvbi5kb3duX3BsdXMubGlzdC5vdXQubnVtIikKTVIudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvTVIuZXhvbi51cF9taW51cy5saXN0Lm91dC5udW0iKQpNUi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL01SLmV4b24uZG93bl9taW51cy5saXN0Lm91dC5udW0iKQpNUi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpNUi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKTVIuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KE1SLnVwX3BsdXMsIE1SLnVwX21pbnVzLCBNUi5kb3duX3BsdXMsIE1SLmRvd25fbWludXMpCgpgYGAKCgojIyBTaG9ydCB0YW5kZW0gcmVwZWF0CgpgYGB7cn0KClNUUi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL1NUUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKU1RSLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9TVFIuZXhvbi5kb3duX3BsdXMubGlzdC5vdXQubnVtIikKU1RSLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL1NUUi5leG9uLnVwX21pbnVzLmxpc3Qub3V0Lm51bSIpClNUUi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL1NUUi5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKU1RSLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdClNUUi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKU1RSLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShTVFIudXBfcGx1cywgU1RSLnVwX21pbnVzLCBTVFIuZG93bl9wbHVzLCBTVFIuZG93bl9taW51cykKCmBgYAoKCgojIyBaLUROQQoKCmBgYHtyfQoKWl9ETkEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9aX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL1pfRE5BLmV4b24uZG93bl9wbHVzLmxpc3Qub3V0Lm51bSIpClpfRE5BLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL1pfRE5BLmV4b24udXBfbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9aX0ROQS5leG9uLmRvd25fbWludXMubGlzdC5vdXQubnVtIikKWl9ETkEudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KWl9ETkEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKClpfRE5BLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShaX0ROQS51cF9wbHVzLCBaX0ROQS51cF9taW51cywgWl9ETkEuZG93bl9wbHVzLCBaX0ROQS5kb3duX21pbnVzKQoKYGBgCgoKIyMgQWxsIE5vbi1CIEROQSBtb3RpZnMgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTV9Ckc0LlRPVEFMWywgTm9uX0I6PSJHNCJdCkRSLlRPVEFMWywgTm9uX0I6PSJEUiJdCkhfRE5BLlRPVEFMWywgTm9uX0I6PSJIIEROQSJdCklSLlRPVEFMWywgTm9uX0I6PSJJUiJdCk1SLlRPVEFMWywgTm9uX0I6PSJNUiJdClNUUi5UT1RBTFssIE5vbl9COj0iU1RSIl0KWl9ETkEuVE9UQUxbLCBOb25fQjo9IlogRE5BIl0KCk5vbl9CLlRPVEFMIDwtIHJiaW5kKEc0LlRPVEFMLCBEUi5UT1RBTCwgSF9ETkEuVE9UQUwsIElSLlRPVEFMLCBNUi5UT1RBTCwgU1RSLlRPVEFMLCBaX0ROQS5UT1RBTCkKCkZpZzEuQSA8LSBnZ3Bsb3QoTm9uX0IuVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCBOb25fQiB+IGV4b25fcG9zICkgKwogIHRoZW1lX2J3KCkKCkZpZzEuQQoKYGBgCgoKCgpgYGB7cn0KCk5vbl9CLlRPVEFMLkVucnJpY2htZW50X1BlYWsgPC0gTm9uX0IuVE9UQUxbICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnkgPSBjKCJOb25fQiIsICJleG9uX3BvcyIgKV0KCgoKd3JpdGUudGFibGUoTm9uX0IuVE9UQUwuRW5ycmljaG1lbnRfUGVhaywgZmlsZSA9ICJOb25fQi5UT1RBTC5FbnJyaWNobWVudF9QZWFrLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLAogICAgICAgICAgICBlb2wgPSAiXG4iLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgIGNvbC5uYW1lcyA9IFRSVUUsIHFtZXRob2QgPSBjKCJlc2NhcGUiLCAiZG91YmxlIiksCiAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICIiKQoKYGBgCgoKIyBEaXN0cmlidXRpb24gb2Ygbm9uLUIgRE5BIG1vdGlmcyBhY3Jvc3Mgd2VhayBhbmQgc3Ryb25nIHNwbGljZSBzaXRlcwoKCldlIGNhbGN1bGF0ZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBub24tQiBETkEgbW90aWZzIGFjcm9zcyBxdWFydGlsZXMgb2Ygc3BsaWNlIHN0cmVuZ3RoLCB3aGVyZSBRMSBhcmUgdGhlIHdlYWtlc3Qgc3BsaWNlIHNpdGVzIGFuZCBRNCBhcmUgdGhlIHN0cm9uZ2VzdC4gIAoKCmBgYHtyfQoKTWVyZ2VfUXMgPC0gZnVuY3Rpb24oUXMubGlzdCwgd2luZG93X2xlbiwgc3RyYW5kICkgewogIAogIFRvdGFsX1FzIDwtIGRhdGEudGFibGUocmJpbmRsaXN0KFFzLmxpc3QpKQogIFFfbmFtZXMgPC0gc2VxKG5yb3coVG90YWxfUXMpL3dpbmRvd19sZW4pCiAgVG90YWxfUXNbLCBROj1yZXAoUV9uYW1lcywgZWFjaD13aW5kb3dfbGVuKV0KICAKICBpZihzdHJhbmQ9PSItIil7CiAgICAKICAgIFRvdGFsX1FzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCiAgfQogIAogIFRvdGFsX1FzCn0KCgpgYGAKCgpgYGB7cn0KbWVyZ2VfcGx1c19taW51cyA8LSBmdW5jdGlvbihwbHVzLCBtaW51cyl7CgogIFRPVEFMIDwtIG1lcmdlKHBsdXMsIG1pbnVzLCBieT1jKCJQb3NpdGlvbiIsICJRIikgKQogIFRPVEFMWyxPY2N1cnJlbmNlczo9T2NjdXJyZW5jZXMueCtPY2N1cnJlbmNlcy55XQogIFRPVEFMWyxtZWRpYW46PW1lZGlhbihPY2N1cnJlbmNlcyksICBieT1jKCJRIildCiAgVE9UQUxbLCBFbnJyaWNobWVudDo9T2NjdXJyZW5jZXMvbWVkaWFuXQogIFRPVEFMWywgUG9zaXRpb246PVBvc2l0aW9uLTFdCiAgCn0KYGBgCgoKYGBge3J9Ck1lcmdlX3VwX2Rvd24gPC0gZnVuY3Rpb24oUXMudXAsIFFzLmRvd24pewoKICBRcy50b3RhbCA8LSByYmluZChRcy51cCwgUXMuZG93bikKICAKICBoYWxmX24gPC0gbnJvdyhRcy50b3RhbCkvMgogIFFzLnRvdGFsWywgZXhvbl9wb3M6PXJlcChjKCJVcHN0cmVhbSIsICJEb3duc3RyZWFtIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgUXMudG90YWwkZXhvbl9wb3MgPC0gIGZhY3RvcihRcy50b3RhbCRleG9uX3BvcywgbGV2ZWxzPWMoIlVwc3RyZWFtIiwgIkRvd25zdHJlYW0iICkpCiAgUXMudG90YWwkUSA8LSAgZmFjdG9yKFFzLnRvdGFsJFEpCiAgCiAgUXMudG90YWwKICAKfQpgYGAKCgoKYGBge3J9CgoKZ2V0X3RvdGFsX1FzIDwtIGZ1bmN0aW9uKFFzLnBsdXMudXAubGlzdCwgUXMubWludXMubGlzdCwgUXMucGx1cy5kb3duLmxpc3QsIFFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbil7CgogIFFzLnBsdXMudXAgPC0gTWVyZ2VfUXMoUXMucGx1cy51cC5saXN0LCB3aW5kb3dfbGVuLCBzdHJhbmQ9IisiKQogIFFzLm1pbnVzLnVwIDwtIE1lcmdlX1FzKFFzLm1pbnVzLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZD0iLSIpCiAgUXMudXAgPC0gbWVyZ2VfcGx1c19taW51cyhRcy5wbHVzLnVwLCBRcy5taW51cy51cCkKICAKICBRcy5wbHVzLmRvd24gPC0gTWVyZ2VfUXMoUXMucGx1cy5kb3duLmxpc3QsIHdpbmRvd19sZW4sIHN0cmFuZD0iKyIpCiAgUXMubWludXMuZG93bjwtIE1lcmdlX1FzKFFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbiwgc3RyYW5kPSItIikKICBRcy5kb3duIDwtIG1lcmdlX3BsdXNfbWludXMoUXMucGx1cy5kb3duLCBRcy5taW51cy5kb3duKQogIAogIFFzLnRvdGFsIDwtIE1lcmdlX3VwX2Rvd24oUXMudXAsIFFzLmRvd24pCiAgCiAgUXMudG90YWwKICAKfQogIApgYGAKCgpgYGB7cn0KaGcxOS5uZXhvbnMgPC0gMTIzNDMzICsgMTIzOTM2CmBgYAoKCgpgYGB7cn0KCgpHNC5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuRzQubGlzdC5vdXQubnVtIikKCkc0LlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuRzQubGlzdC5vdXQubnVtIikKCkc0LlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCgpHNC5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuRzQubGlzdC5vdXQubnVtIikKRzQuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLkc0Lmxpc3Qub3V0Lm51bSIpCkc0LlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5HNC5saXN0Lm91dC5udW0iKQpHNC5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuRzQubGlzdC5vdXQubnVtIikKCkc0LlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0LlExX3VwX3BsdXMsIEc0LlEyX3VwX3BsdXMsIEc0LlEzX3VwX3BsdXMsIEc0LlE0X3VwX3BsdXMpCkc0LlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNC5RMV91cF9taW51cywgRzQuUTJfdXBfbWludXMsIEc0LlEzX3VwX21pbnVzLCBHNC5RNF91cF9taW51cykKRzQuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNC5RMV9kb3duX3BsdXMsIEc0LlEyX2Rvd25fcGx1cywgRzQuUTNfZG93bl9wbHVzLCBHNC5RNF9kb3duX3BsdXMpCkc0LlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0LlExX2Rvd25fbWludXMsIEc0LlEyX2Rvd25fbWludXMsIEc0LlEzX2Rvd25fbWludXMsIEc0LlE0X2Rvd25fbWludXMpCkc0LndpbmRvd19sZW4gPSAyMDAwCgpHNC5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzQuUXMucGx1cy51cC5saXN0LCBHNC5Rcy5taW51cy5saXN0LCBHNC5Rcy5wbHVzLmRvd24ubGlzdCwgRzQuUXMubWludXMuZG93bi5saXN0LCBHNC53aW5kb3dfbGVuKQoKRzQuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzQuUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCgpnZ3Bsb3QoRzQuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpK2xhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgpgYGB7cn0KCgoKRzQuUXMudG90YWwuYmlub21pYWwgPC0gY2JpbmQoRzQuUXMudG90YWwsICBHNC5Rcy50b3RhbFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIGhnMTkubmV4b25zLzQpIF0pCkc0LlFzLnRvdGFsLmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAiUSIpXQpHNC5Rcy50b3RhbC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCmdncGxvdChHNC5Rcy50b3RhbC5iaW5vbWlhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIGdlb21fcmliYm9uKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGZpbGw9USwgeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UpLCBhbHBoYT0wLjMpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpK2xhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCmBgYAoKCgoKCmBgYHtyfQoKCkRSLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnExLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMy5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnE0LmJlZC5EUnMubGlzdC5vdXQubnVtIikKCkRSLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMi5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMy5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCgpEUi5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnExLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMi5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnE0LmJlZC5EUnMubGlzdC5vdXQubnVtIikKCkRSLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnExLmJlZC5EUnMubGlzdC5vdXQubnVtIikKRFIuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLkRScy5saXN0Lm91dC5udW0iKQpEUi5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMy5iZWQuRFJzLmxpc3Qub3V0Lm51bSIpCkRSLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5EUnMubGlzdC5vdXQubnVtIikKCkRSLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KERSLlExX3VwX3BsdXMsIERSLlEyX3VwX3BsdXMsIERSLlEzX3VwX3BsdXMsIERSLlE0X3VwX3BsdXMpCkRSLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChEUi5RMV91cF9taW51cywgRFIuUTJfdXBfbWludXMsIERSLlEzX3VwX21pbnVzLCBEUi5RNF91cF9taW51cykKRFIuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChEUi5RMV9kb3duX3BsdXMsIERSLlEyX2Rvd25fcGx1cywgRFIuUTNfZG93bl9wbHVzLCBEUi5RNF9kb3duX3BsdXMpCkRSLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KERSLlExX2Rvd25fbWludXMsIERSLlEyX2Rvd25fbWludXMsIERSLlEzX2Rvd25fbWludXMsIERSLlE0X2Rvd25fbWludXMpCkRSLndpbmRvd19sZW4gPSAyMDAwCgpEUi5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRFIuUXMucGx1cy51cC5saXN0LCBEUi5Rcy5taW51cy5saXN0LCBEUi5Rcy5wbHVzLmRvd24ubGlzdCwgRFIuUXMubWludXMuZG93bi5saXN0LCBEUi53aW5kb3dfbGVuKQoKCmdncGxvdChEUi5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkrCiAgdGhlbWVfYncoKQogCiAgCiAgCgpgYGAKCgoKCgpgYGB7cn0KCgpIX0ROQS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCgpIX0ROQS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKSF9ETkEuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLkhfRE5BLmxpc3Qub3V0Lm51bSIpCkhfRE5BLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5IX0ROQS5saXN0Lm91dC5udW0iKQpIX0ROQS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuSF9ETkEubGlzdC5vdXQubnVtIikKCkhfRE5BLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEhfRE5BLlExX3VwX3BsdXMsIEhfRE5BLlEyX3VwX3BsdXMsIEhfRE5BLlEzX3VwX3BsdXMsIEhfRE5BLlE0X3VwX3BsdXMpCkhfRE5BLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChIX0ROQS5RMV91cF9taW51cywgSF9ETkEuUTJfdXBfbWludXMsIEhfRE5BLlEzX3VwX21pbnVzLCBIX0ROQS5RNF91cF9taW51cykKSF9ETkEuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChIX0ROQS5RMV9kb3duX3BsdXMsIEhfRE5BLlEyX2Rvd25fcGx1cywgSF9ETkEuUTNfZG93bl9wbHVzLCBIX0ROQS5RNF9kb3duX3BsdXMpCkhfRE5BLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEhfRE5BLlExX2Rvd25fbWludXMsIEhfRE5BLlEyX2Rvd25fbWludXMsIEhfRE5BLlEzX2Rvd25fbWludXMsIEhfRE5BLlE0X2Rvd25fbWludXMpCkhfRE5BLndpbmRvd19sZW4gPSAyMDAwCgpIX0ROQS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoSF9ETkEuUXMucGx1cy51cC5saXN0LCBIX0ROQS5Rcy5taW51cy5saXN0LCBIX0ROQS5Rcy5wbHVzLmRvd24ubGlzdCwgSF9ETkEuUXMubWludXMuZG93bi5saXN0LCBIX0ROQS53aW5kb3dfbGVuKQoKCmdncGxvdChIX0ROQS5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkKCmBgYAoKCgoKCgoKYGBge3J9CgoKSVIuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5JUnMubGlzdC5vdXQubnVtIikKCklSLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLklScy5saXN0Lm91dC5udW0iKQpJUi5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuSVJzLmxpc3Qub3V0Lm51bSIpCklSLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5JUnMubGlzdC5vdXQubnVtIikKSVIuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLklScy5saXN0Lm91dC5udW0iKQoKSVIuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoSVIuUTFfdXBfcGx1cywgSVIuUTJfdXBfcGx1cywgSVIuUTNfdXBfcGx1cywgSVIuUTRfdXBfcGx1cykKSVIuUXMubWludXMubGlzdCA8LSBsaXN0KElSLlExX3VwX21pbnVzLCBJUi5RMl91cF9taW51cywgSVIuUTNfdXBfbWludXMsIElSLlE0X3VwX21pbnVzKQpJUi5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KElSLlExX2Rvd25fcGx1cywgSVIuUTJfZG93bl9wbHVzLCBJUi5RM19kb3duX3BsdXMsIElSLlE0X2Rvd25fcGx1cykKSVIuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoSVIuUTFfZG93bl9taW51cywgSVIuUTJfZG93bl9taW51cywgSVIuUTNfZG93bl9taW51cywgSVIuUTRfZG93bl9taW51cykKSVIud2luZG93X2xlbiA9IDIwMDAKCklSLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhJUi5Rcy5wbHVzLnVwLmxpc3QsIElSLlFzLm1pbnVzLmxpc3QsIElSLlFzLnBsdXMuZG93bi5saXN0LCBJUi5Rcy5taW51cy5kb3duLmxpc3QsIElSLndpbmRvd19sZW4pCgoKZ2dwbG90KElSLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKQoKCmBgYAoKCgoKCgoKYGBge3J9CgoKTVIuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTEuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTQuYmVkLk1Scy5saXN0Lm91dC5udW0iKQoKTVIuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEzLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5NUnMubGlzdC5vdXQubnVtIikKCk1SLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX21pbnVzLnEyLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLk1Scy5saXN0Lm91dC5udW0iKQoKTVIuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTEuYmVkLk1Scy5saXN0Lm91dC5udW0iKQpNUi5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuTVJzLmxpc3Qub3V0Lm51bSIpCk1SLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5NUnMubGlzdC5vdXQubnVtIikKTVIuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTQuYmVkLk1Scy5saXN0Lm91dC5udW0iKQoKTVIuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoTVIuUTFfdXBfcGx1cywgTVIuUTJfdXBfcGx1cywgTVIuUTNfdXBfcGx1cywgTVIuUTRfdXBfcGx1cykKTVIuUXMubWludXMubGlzdCA8LSBsaXN0KE1SLlExX3VwX21pbnVzLCBNUi5RMl91cF9taW51cywgTVIuUTNfdXBfbWludXMsIE1SLlE0X3VwX21pbnVzKQpNUi5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KE1SLlExX2Rvd25fcGx1cywgTVIuUTJfZG93bl9wbHVzLCBNUi5RM19kb3duX3BsdXMsIE1SLlE0X2Rvd25fcGx1cykKTVIuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoTVIuUTFfZG93bl9taW51cywgTVIuUTJfZG93bl9taW51cywgTVIuUTNfZG93bl9taW51cywgTVIuUTRfZG93bl9taW51cykKTVIud2luZG93X2xlbiA9IDIwMDAKCk1SLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhNUi5Rcy5wbHVzLnVwLmxpc3QsIE1SLlFzLm1pbnVzLmxpc3QsIE1SLlFzLnBsdXMuZG93bi5saXN0LCBNUi5Rcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4pCgoKZ2dwbG90KE1SLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKQoKCmBgYAoKCgoKCgoKYGBge3J9CgoKU1RSLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnExLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMi5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTMuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnE0LmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpCgpTVFIuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnExLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTIuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMy5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnE0LmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpCgpTVFIuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMS5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMi5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xMy5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9taW51cy5xNC5iZWQuU1RScy5saXN0Lm91dC5udW0iKQoKU1RSLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnExLmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpClNUUi5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMi5iZWQuU1RScy5saXN0Lm91dC5udW0iKQpTVFIuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTMuYmVkLlNUUnMubGlzdC5vdXQubnVtIikKU1RSLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5TVFJzLmxpc3Qub3V0Lm51bSIpCgpTVFIuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoU1RSLlExX3VwX3BsdXMsIFNUUi5RMl91cF9wbHVzLCBTVFIuUTNfdXBfcGx1cywgU1RSLlE0X3VwX3BsdXMpClNUUi5Rcy5taW51cy5saXN0IDwtIGxpc3QoU1RSLlExX3VwX21pbnVzLCBTVFIuUTJfdXBfbWludXMsIFNUUi5RM191cF9taW51cywgU1RSLlE0X3VwX21pbnVzKQpTVFIuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChTVFIuUTFfZG93bl9wbHVzLCBTVFIuUTJfZG93bl9wbHVzLCBTVFIuUTNfZG93bl9wbHVzLCBTVFIuUTRfZG93bl9wbHVzKQpTVFIuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoU1RSLlExX2Rvd25fbWludXMsIFNUUi5RMl9kb3duX21pbnVzLCBTVFIuUTNfZG93bl9taW51cywgU1RSLlE0X2Rvd25fbWludXMpClNUUi53aW5kb3dfbGVuID0gMjAwMAoKU1RSLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhTVFIuUXMucGx1cy51cC5saXN0LCBTVFIuUXMubWludXMubGlzdCwgU1RSLlFzLnBsdXMuZG93bi5saXN0LCBTVFIuUXMubWludXMuZG93bi5saXN0LCBTVFIud2luZG93X2xlbikKCgpnZ3Bsb3QoU1RSLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKQoKYGBgCgoKCgpgYGB7cn0KCgpaX0ROQS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLnVwX3BsdXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi51cF9wbHVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfcGx1cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9wbHVzLnEyLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX3BsdXMucTMuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fcGx1cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTEuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTMuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24udXBfbWludXMucTQuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpCgpaX0ROQS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xMS5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKWl9ETkEuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvQWxsX25vbl9Ccy9xMV9xNC9leG9uLmRvd25fbWludXMucTIuYmVkLlpfRE5BLmxpc3Qub3V0Lm51bSIpClpfRE5BLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0FsbF9ub25fQnMvcTFfcTQvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5aX0ROQS5saXN0Lm91dC5udW0iKQpaX0ROQS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9BbGxfbm9uX0JzL3ExX3E0L2V4b24uZG93bl9taW51cy5xNC5iZWQuWl9ETkEubGlzdC5vdXQubnVtIikKClpfRE5BLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KFpfRE5BLlExX3VwX3BsdXMsIFpfRE5BLlEyX3VwX3BsdXMsIFpfRE5BLlEzX3VwX3BsdXMsIFpfRE5BLlE0X3VwX3BsdXMpClpfRE5BLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChaX0ROQS5RMV91cF9taW51cywgWl9ETkEuUTJfdXBfbWludXMsIFpfRE5BLlEzX3VwX21pbnVzLCBaX0ROQS5RNF91cF9taW51cykKWl9ETkEuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChaX0ROQS5RMV9kb3duX3BsdXMsIFpfRE5BLlEyX2Rvd25fcGx1cywgWl9ETkEuUTNfZG93bl9wbHVzLCBaX0ROQS5RNF9kb3duX3BsdXMpClpfRE5BLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KFpfRE5BLlExX2Rvd25fbWludXMsIFpfRE5BLlEyX2Rvd25fbWludXMsIFpfRE5BLlEzX2Rvd25fbWludXMsIFpfRE5BLlE0X2Rvd25fbWludXMpClpfRE5BLndpbmRvd19sZW4gPSAyMDAwCgpaX0ROQS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoWl9ETkEuUXMucGx1cy51cC5saXN0LCBaX0ROQS5Rcy5taW51cy5saXN0LCBaX0ROQS5Rcy5wbHVzLmRvd24ubGlzdCwgWl9ETkEuUXMubWludXMuZG93bi5saXN0LCBaX0ROQS53aW5kb3dfbGVuKQoKCmdncGxvdChaX0ROQS5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkKCmBgYAoKCgoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03fQpHNC5Rcy50b3RhbFssIE5vbl9COj0iRzQiXQpEUi5Rcy50b3RhbFssIE5vbl9COj0iRFIiXQpIX0ROQS5Rcy50b3RhbFssIE5vbl9COj0iSC1ETkEiXQpJUi5Rcy50b3RhbFssIE5vbl9COj0iSVIiXQpNUi5Rcy50b3RhbFssIE5vbl9COj0iTVIiXQpTVFIuUXMudG90YWxbLCBOb25fQjo9IlNUUiJdClpfRE5BLlFzLnRvdGFsWywgTm9uX0I6PSJaLUROQSJdCgoKCk5vbl9CLlFzLlRPVEFMIDwtIHJiaW5kKEc0LlFzLnRvdGFsLCBEUi5Rcy50b3RhbCwgSF9ETkEuUXMudG90YWwsIElSLlFzLnRvdGFsLCBNUi5Rcy50b3RhbCwgU1RSLlFzLnRvdGFsLCBaX0ROQS5Rcy50b3RhbCkKCk5vbl9CLlFzLlRPVEFMJFEgPC0gbWFwdmFsdWVzKE5vbl9CLlFzLlRPVEFMJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQoKCgpnZ3Bsb3QoTm9uX0IuUXMuVE9UQUwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggTm9uX0IgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKCgoKCgpgYGAKCgoKCgoKYGBge3J9Ck5vbl9CLlFzLlRPVEFMLkVucnJpY2htZW50X1BlYWsgPC0gTm9uX0IuUXMuVE9UQUxbICAsIC4oRW5ycmljaG1lbnRfUGVhaz1tYXgoRW5ycmljaG1lbnQpKSAsIGJ5PSBjKCJOb25fQiIsICJleG9uX3BvcyIsICJRIildCgp3cml0ZS50YWJsZShOb25fQi5Rcy5UT1RBTC5FbnJyaWNobWVudF9QZWFrLCBmaWxlID0gIk5vbl9CLlFzLlRPVEFMLkVucnJpY2htZW50X1BlYWsudHh0IiwgYXBwZW5kID0gRkFMU0UsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsCiAgICAgICAgICAgIGVvbCA9ICJcbiIsIG5hID0gIk5BIiwgZGVjID0gIi4iLCByb3cubmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgcW1ldGhvZCA9IGMoImVzY2FwZSIsICJkb3VibGUiKSwKICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIiIpCmBgYAoKCgoKCgoKIyBUZW1wbGF0ZSAtIG5vbiB0ZW1wbGF0ZQoKClRvIGludmVzdGlnYXRlIGlmIHRoZSBkaXN0cmlidXRpb24gb2Ygbm9uLUIgRE5BIG1vdGlmcyBpcyBiaWFzZWQgYnkgdHJhbnNjcmlwdGlvbiBkaXJlY3Rpb24sIHdlIGdlbmVyYXRlIGAubnVtYCBmaWxlcyB3aGVyZSB0aGUgY291bnRzIHdlcmUgc2VwYXJhdGVkIGJ5IHRlbXBsYXRlIGFuZCBub24gdGVtcGxhdGVkIHN0cmFuZHM6CgoKKiBUZW1wbGF0ZSA9IHBsdXNfbWludXMsIG1pbnVzX3BsdXMKKiBOb24tdGVtcGxhdGUgPSBtaW51c19taW51cywgcGx1c19wbHVzCgoKCgpgYGB7cn0KCgpHNC50ZW1wbGF0ZS5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnExLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTIuYmVkLkc0c19taW51c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMy5iZWQuRzRzX21pbnVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnE0LmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC50ZW1wbGF0ZS5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTEuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnEyLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9taW51cy5xMy5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfbWludXMucTQuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKCkc0LnRlbXBsYXRlLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnExLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEyLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEzLmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnE0LmJlZC5HNHNfbWludXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC50ZW1wbGF0ZS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0LnRlbXBsYXRlLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTIuYmVkLkc0c19wbHVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQudGVtcGxhdGUuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMy5iZWQuRzRzX3BsdXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC50ZW1wbGF0ZS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5HNHNfcGx1c19taW51cy5saXN0LmZpbmFsLm51bSIpCgoKCgpHNC5ub25fdGVtcGxhdGUuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xMS5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi51cF9wbHVzLnEyLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX3BsdXMucTMuYmVkLkc0c19wbHVzX3BsdXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24udXBfcGx1cy5xNC5iZWQuRzRzX3BsdXNfcGx1cy5saXN0LmZpbmFsLm51bSIpCgpHNC5ub25fdGVtcGxhdGUuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnExLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnEyLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnEzLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLnVwX21pbnVzLnE0LmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQoKRzQubm9uX3RlbXBsYXRlLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnExLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEyLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnEzLmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9wbHVzLnE0LmJlZC5HNHNfcGx1c19wbHVzLmxpc3QuZmluYWwubnVtIikKCkc0Lm5vbl90ZW1wbGF0ZS5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQpHNC5ub25fdGVtcGxhdGUuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvdGVtcGxhdGVfbm9uX3RlbXBsYXRlL2V4b24uZG93bl9taW51cy5xMi5iZWQuRzRzX21pbnVzX21pbnVzLmxpc3QuZmluYWwubnVtIikKRzQubm9uX3RlbXBsYXRlLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL3RlbXBsYXRlX25vbl90ZW1wbGF0ZS9leG9uLmRvd25fbWludXMucTMuYmVkLkc0c19taW51c19taW51cy5saXN0LmZpbmFsLm51bSIpCkc0Lm5vbl90ZW1wbGF0ZS5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi90ZW1wbGF0ZV9ub25fdGVtcGxhdGUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5HNHNfbWludXNfbWludXMubGlzdC5maW5hbC5udW0iKQoKCmBgYAoKCgpgYGB7cn0KRzQudGVtcGxhdGUuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzQudGVtcGxhdGUuUTFfdXBfcGx1cywgRzQudGVtcGxhdGUuUTJfdXBfcGx1cywgRzQudGVtcGxhdGUuUTNfdXBfcGx1cywgRzQudGVtcGxhdGUuUTRfdXBfcGx1cykKRzQudGVtcGxhdGUuUXMubWludXMubGlzdCA8LSBsaXN0KEc0LnRlbXBsYXRlLlExX3VwX21pbnVzLCBHNC50ZW1wbGF0ZS5RMl91cF9taW51cywgRzQudGVtcGxhdGUuUTNfdXBfbWludXMsIEc0LnRlbXBsYXRlLlE0X3VwX21pbnVzKQpHNC50ZW1wbGF0ZS5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0LnRlbXBsYXRlLlExX2Rvd25fcGx1cywgRzQudGVtcGxhdGUuUTJfZG93bl9wbHVzLCBHNC50ZW1wbGF0ZS5RM19kb3duX3BsdXMsIEc0LnRlbXBsYXRlLlE0X2Rvd25fcGx1cykKRzQudGVtcGxhdGUuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzQudGVtcGxhdGUuUTFfZG93bl9taW51cywgRzQudGVtcGxhdGUuUTJfZG93bl9taW51cywgRzQudGVtcGxhdGUuUTNfZG93bl9taW51cywgRzQudGVtcGxhdGUuUTRfZG93bl9taW51cykKRzQudGVtcGxhdGUud2luZG93X2xlbiA9IDIwMDAKCkc0LnRlbXBsYXRlLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNC50ZW1wbGF0ZS5Rcy5wbHVzLnVwLmxpc3QsIEc0LnRlbXBsYXRlLlFzLm1pbnVzLmxpc3QsIEc0LnRlbXBsYXRlLlFzLnBsdXMuZG93bi5saXN0LCBHNC50ZW1wbGF0ZS5Rcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4pCmBgYAoKCgpgYGB7cn0KRzQubm9uX3RlbXBsYXRlLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0Lm5vbl90ZW1wbGF0ZS5RMV91cF9wbHVzLCBHNC5ub25fdGVtcGxhdGUuUTJfdXBfcGx1cywgRzQubm9uX3RlbXBsYXRlLlEzX3VwX3BsdXMsIEc0Lm5vbl90ZW1wbGF0ZS5RNF91cF9wbHVzKQpHNC5ub25fdGVtcGxhdGUuUXMubWludXMubGlzdCA8LSBsaXN0KEc0Lm5vbl90ZW1wbGF0ZS5RMV91cF9taW51cywgRzQubm9uX3RlbXBsYXRlLlEyX3VwX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTNfdXBfbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RNF91cF9taW51cykKRzQubm9uX3RlbXBsYXRlLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzQubm9uX3RlbXBsYXRlLlExX2Rvd25fcGx1cywgRzQubm9uX3RlbXBsYXRlLlEyX2Rvd25fcGx1cywgRzQubm9uX3RlbXBsYXRlLlEzX2Rvd25fcGx1cywgRzQubm9uX3RlbXBsYXRlLlE0X2Rvd25fcGx1cykKRzQubm9uX3RlbXBsYXRlLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0Lm5vbl90ZW1wbGF0ZS5RMV9kb3duX21pbnVzLCBHNC5ub25fdGVtcGxhdGUuUTJfZG93bl9taW51cywgRzQubm9uX3RlbXBsYXRlLlEzX2Rvd25fbWludXMsIEc0Lm5vbl90ZW1wbGF0ZS5RNF9kb3duX21pbnVzKQpHNC5ub25fdGVtcGxhdGUud2luZG93X2xlbiA9IDIwMDAKCkc0Lm5vbl90ZW1wbGF0ZS5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzQubm9uX3RlbXBsYXRlLlFzLnBsdXMudXAubGlzdCwgRzQubm9uX3RlbXBsYXRlLlFzLm1pbnVzLmxpc3QsIEc0Lm5vbl90ZW1wbGF0ZS5Rcy5wbHVzLmRvd24ubGlzdCwgRzQubm9uX3RlbXBsYXRlLlFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbikKYGBgCgoKYGBge3J9CgpHNC50ZW1wbGF0ZS5Rcy50b3RhbApHNC5ub25fdGVtcGxhdGUuUXMudG90YWwKCgpHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwgPC0gcmJpbmQoRzQudGVtcGxhdGUuUXMudG90YWwsIEc0Lm5vbl90ZW1wbGF0ZS5Rcy50b3RhbCkKICAKaGFsZl9uIDwtIG5yb3coRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsKS8yCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbFssIFN0cmFuZDo9cmVwKGMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIpLCBlYWNoPWhhbGZfbikgXQogIAogIAogIAogIApHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwkU3RyYW5kIDwtICBmYWN0b3IoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKYGBge3J9CgoKCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCgoKCgoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLmJpbm9taWFsIDwtIGNiaW5kKEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbCwgIEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIGhnMTkubmV4b25zLzgpIF0pCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5iaW5vbWlhbFssIG1lZGlhbjo9TlVMTF0KCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5iaW5vbWlhbFsgLCBtZWRpYW46PW1lZGlhbihQb2ludEVzdCksIGJ5PWMoImV4b25fcG9zIiwgIlEiLCAiU3RyYW5kIildCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5Rcy50b3RhbC5iaW5vbWlhbFssIGA6PWAoRW5ycmljaG1lbnQ9UG9pbnRFc3QvbWVkaWFuLCBFbnJyaWNobWVudF9sPUxvd2VyL21lZGlhbiwgRW5ycmljaG1lbnRfdT1VcHBlci9tZWRpYW4pXQoKCkZpZzIuQSA8LSBnZ3Bsb3QoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLmJpbm9taWFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgIGdlb21fcmliYm9uKGFlcyh4PVBvc2l0aW9uLCBmaWxsPVEsIHltaW49RW5ycmljaG1lbnRfbCwgeW1heD1FbnJyaWNobWVudF91KSwgYWxwaGE9MC4zKSArCiAgeGxpbShjKC0xNTAsMTUwKSkgKwogIGZhY2V0X2dyaWQoIFN0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCkZpZzIuQQoKYGBgCgoKCgpgYGB7cn0KCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbCA8LSBHNC50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUXMudG90YWxbICwgLihPY2N1cnJlbmNlcz1zdW0oT2NjdXJyZW5jZXMpKSAsIGJ5PWMoIlN0cmFuZCIsICJleG9uX3BvcyIsICJQb3NpdGlvbiIpXQoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsWyAsIG1lZGlhbjo9bWVkaWFuKE9jY3VycmVuY2VzKSAsIGJ5PWMoIlN0cmFuZCIsICJleG9uX3BvcyIpXQoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsWyAsIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW4gLCBieT1jKCJTdHJhbmQiLCAiZXhvbl9wb3MiLCAiUG9zaXRpb24iKV0KCgpnZ3Bsb3QoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCgpgYGAKCgpgYGB7cn0KCkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbF9QZWFrIDwtIEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbFsgICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnk9IGMoIlN0cmFuZCIsICJleG9uX3BvcyIpXQoKCndyaXRlLnRhYmxlKEc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbF9QZWFrLCBmaWxlID0gIkc0LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS50b3RhbF9QZWFrLnR4dCIsIGFwcGVuZCA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLAogICAgICAgICAgICBlb2wgPSAiXG4iLCBuYSA9ICJOQSIsIGRlYyA9ICIuIiwgcm93Lm5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgIGNvbC5uYW1lcyA9IFRSVUUsIHFtZXRob2QgPSBjKCJlc2NhcGUiLCAiZG91YmxlIiksCiAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICIiKQpgYGAKCgoKYGBge3J9CgoKRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLkVucnJpY2htZW50X1BlYWsgPC0gRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsWyAgLCAuKEVucnJpY2htZW50X1BlYWs9bWF4KEVucnJpY2htZW50KSkgLCBieT0gYyggImV4b25fcG9zIiwgIlEiLCAiU3RyYW5kIiApXQoKd3JpdGUudGFibGUoRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLkVucnJpY2htZW50X1BlYWssIGZpbGUgPSAiRzQudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlFzLnRvdGFsLkVucnJpY2htZW50X1BlYWsudHh0IiwgYXBwZW5kID0gRkFMU0UsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsCiAgICAgICAgICAgIGVvbCA9ICJcbiIsIG5hID0gIk5BIiwgZGVjID0gIi4iLCByb3cubmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgcW1ldGhvZCA9IGMoImVzY2FwZSIsICJkb3VibGUiKSwKICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIiIpCgpgYGAKCgojIEc0IFJVTlMKCkhlcmUgd2UgZXhwbG9yZWQgdGhlIGVucmljaG1lbnQgb2YgRy1xdWFkcnVwbGV4ZXMgd2l0aCBkaWZmZXJlbnQgRy1ydW4gbGVuZ3RoCgoKYGBge3J9CgpHMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuVHdpY2VfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkczX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi51cF9wbHVzLmJlZC5UaHJlZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLnVwX3BsdXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi51cF9wbHVzLmJlZC5GaXZlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfcGx1cy5iZWQuU2l4X0dfcnVucy5saXN0Lm91dC5udW0iKQoKRzFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi51cF9taW51cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLnVwX21pbnVzLmJlZC5Ud2ljZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi51cF9taW51cy5iZWQuVGhyZWVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLkZpdmVfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc2X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24udXBfbWludXMuYmVkLlNpeF9HX3J1bnMubGlzdC5vdXQubnVtIikKCkcxX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLmRvd25fcGx1cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLlR3aWNlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLlRocmVlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi5kb3duX3BsdXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkc1X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLmRvd25fcGx1cy5iZWQuRml2ZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzZfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24uZG93bl9wbHVzLmJlZC5TaXhfR19ydW5zLmxpc3Qub3V0Lm51bSIpCgpHMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuU2luZ2xlX0dfcnVucy5saXN0Lm91dC5udW0iKQpHMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuVHdpY2VfR19ydW5zLmxpc3Qub3V0Lm51bSIpCkczX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3J1bnMvZXhvbi5kb3duX21pbnVzLmJlZC5UaHJlZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLkZvdXJfR19ydW5zLmxpc3Qub3V0Lm51bSIpICAjbWlzc2luZwpHNV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9ydW5zL2V4b24uZG93bl9taW51cy5iZWQuRml2ZV9HX3J1bnMubGlzdC5vdXQubnVtIikKRzZfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfcnVucy9leG9uLmRvd25fbWludXMuYmVkLlNpeF9HX3J1bnMubGlzdC5vdXQubnVtIikKYGBgCgoKCmBgYHtyfQpHcnVucy51cF9wbHVzLmxpc3QgPC0gbGlzdChHMV91cF9wbHVzLCBHMl91cF9wbHVzLCBHM191cF9wbHVzLCBHNF91cF9wbHVzLCBHNV91cF9wbHVzLCBHNl91cF9wbHVzKQpHcnVucy51cF9taW51cy5saXN0IDwtIGxpc3QoRzFfdXBfbWludXMsIEcyX3VwX21pbnVzLCBHM191cF9taW51cywgRzRfdXBfbWludXMsIEc1X3VwX21pbnVzLCBHNl91cF9taW51cykKCkdydW5zLmRvd25fcGx1cy5saXN0IDwtIGxpc3QoRzFfZG93bl9wbHVzLCBHMl9kb3duX3BsdXMsIEczX2Rvd25fcGx1cywgRzRfZG93bl9wbHVzLCBHNV9kb3duX3BsdXMsIEc2X2Rvd25fcGx1cykKR3J1bnMuZG93bl9taW51cy5saXN0IDwtIGxpc3QoRzFfZG93bl9taW51cywgRzJfZG93bl9taW51cywgRzNfZG93bl9taW51cywgRzRfZG93bl9taW51cywgRzVfZG93bl9taW51cywgRzZfZG93bl9taW51cykKCgpHcnVucy53aW5kb3dfbGVuID0gMjAwMAoKR3J1bnMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEdydW5zLnVwX3BsdXMubGlzdCwgR3J1bnMudXBfbWludXMubGlzdCwgR3J1bnMuZG93bl9wbHVzLmxpc3QsIEdydW5zLmRvd25fbWludXMubGlzdCwgR3J1bnMud2luZG93X2xlbikKCkdydW5zLnRvdGFsWywgR19ydW5fbGVuZ3RoOj1RXQpgYGAKCgoKYGBge3J9CgoKR3J1bnMudG90YWwuYmlub21pYWwgPC0gY2JpbmQoR3J1bnMudG90YWwsICBHcnVucy50b3RhbFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIGhnMTkubmV4b25zKSBdKQpHcnVucy50b3RhbC5iaW5vbWlhbFssIG1lZGlhbjo9TlVMTF0KCkdydW5zLnRvdGFsLmJpbm9taWFsWyAsIG1lZGlhbjo9bWVkaWFuKFBvaW50RXN0KSwgYnk9YygiZXhvbl9wb3MiLCAiUSIgKV0KR3J1bnMudG90YWwuYmlub21pYWxbLCBgOj1gKEVucnJpY2htZW50PVBvaW50RXN0L21lZGlhbiwgRW5ycmljaG1lbnRfbD1Mb3dlci9tZWRpYW4sIEVucnJpY2htZW50X3U9VXBwZXIvbWVkaWFuKV0KCgpGaWcyLkIgPC0gZ2dwbG90KEdydW5zLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPUdfcnVuX2xlbmd0aCkpICsKICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbiwgZmlsbD1RLCB5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSksIGFscGhhPTAuMykgKwogIHhsaW0oYygtMTAwLDEwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoY29sb3VyID0gIk51bWJlciBvZiBjb25zZWN1dGl2ZSBHLXJ1bnMiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKRmlnMi5CCmBgYAoKCgoKCmBgYHtyfQoKR3J1bnMudG90YWwuRW5ycmljaG1lbnRfUGVhayA8LSBHcnVucy50b3RhbFsgICwgLihFbnJyaWNobWVudF9QZWFrPW1heChFbnJyaWNobWVudCkpICwgYnk9IGMoICJleG9uX3BvcyIsICJHX3J1bl9sZW5ndGgiKV0KCndyaXRlLnRhYmxlKEdydW5zLnRvdGFsLkVucnJpY2htZW50X1BlYWssIGZpbGUgPSAiR3J1bnMudG90YWwuRW5ycmljaG1lbnRfUGVhay50eHQiLCBhcHBlbmQgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0IiwKICAgICAgICAgICAgZW9sID0gIlxuIiwgbmEgPSAiTkEiLCBkZWMgPSAiLiIsIHJvdy5uYW1lcyA9IEZBTFNFLAogICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCBxbWV0aG9kID0gYygiZXNjYXBlIiwgImRvdWJsZSIpLAogICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiIikKYGBgCgoKCgoKCgojIyBHNCBlbnJpY2htZW50IGFjcm9zcyBldm9sdXRpb24KCgoKCldlIGFuYWx5emVkIHRoZSBHNCBlbnJpY2htZW50IGFjcm9zcyBzcGxpY2Ugc2l0ZXMgZnJvbSBkaWZmZXJlbnQgc3BlY2llcwoKCgpgYGB7cn0KCnN1c1NjcjExLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vc3VzU2NyMTEuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9zdXNTY3IxMS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuc3VzU2NyMTEudHh0Li5saXN0Lm91dC5udW0iKQpzdXNTY3IxMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9zdXNTY3IxMS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vc3VzU2NyMTEuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5zdXNTY3IxMS50eHQuLmxpc3Qub3V0Lm51bSIpCnN1c1NjcjExLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCnN1c1NjcjExLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnN1c1NjcjExLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShzdXNTY3IxMS51cF9wbHVzLCBzdXNTY3IxMS51cF9taW51cywgc3VzU2NyMTEuZG93bl9wbHVzLCBzdXNTY3IxMS5kb3duX21pbnVzKQoKCmBgYAoKCgoKCmBgYHtyfQoKVEFJUjEwLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vVEFJUjEwLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9UQUlSMTAuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLlRBSVIxMC50eHQuLmxpc3Qub3V0Lm51bSIpClRBSVIxMC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9UQUlSMTAuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vVEFJUjEwLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuVEFJUjEwLnR4dC4ubGlzdC5vdXQubnVtIikKVEFJUjEwLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdClRBSVIxMC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpUQUlSMTAuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KFRBSVIxMC51cF9wbHVzLCBUQUlSMTAudXBfbWludXMsIFRBSVIxMC5kb3duX3BsdXMsIFRBSVIxMC5kb3duX21pbnVzKQoKCmBgYAoKCgoKCgpgYGB7cn0KCmFub0NhcjIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9hbm9DYXIyLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuYW5vQ2FyMi50eHQuLmxpc3Qub3V0Lm51bSIpCmFub0NhcjIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2Fub0NhcjIuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmFub0NhcjIudHh0Li5saXN0Lm91dC5udW0iKQphbm9DYXIyLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2Fub0NhcjIuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuYW5vQ2FyMi50eHQuLmxpc3Qub3V0Lm51bSIpCmFub0NhcjIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9hbm9DYXIyLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuYW5vQ2FyMi50eHQuLmxpc3Qub3V0Lm51bSIpCmFub0NhcjIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KYW5vQ2FyMi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgphbm9DYXIyLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShhbm9DYXIyLnVwX3BsdXMsIGFub0NhcjIudXBfbWludXMsIGFub0NhcjIuZG93bl9wbHVzLCBhbm9DYXIyLmRvd25fbWludXMpCgoKYGBgCgoKCmBgYHtyfQoKeGVuVHJvOS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL3hlblRybzkuZXhvbi51cF9wbHVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0veGVuVHJvOS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUueGVuVHJvOS50eHQuLmxpc3Qub3V0Lm51bSIpCnhlblRybzkudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0veGVuVHJvOS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL3hlblRybzkuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS54ZW5Ucm85LnR4dC4ubGlzdC5vdXQubnVtIikKeGVuVHJvOS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQp4ZW5Ucm85LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnhlblRybzkuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KHhlblRybzkudXBfcGx1cywgeGVuVHJvOS51cF9taW51cywgeGVuVHJvOS5kb3duX3BsdXMsIHhlblRybzkuZG93bl9taW51cykKCgpgYGAKCgoKCmBgYHtyfQoKY2UxMC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2NlMTAuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vY2UxMC5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuY2UxMC50eHQuLmxpc3Qub3V0Lm51bSIpCmNlMTAudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vY2UxMC5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2NlMTAuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5jZTEwLnR4dC4ubGlzdC5vdXQubnVtIikKY2UxMC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpjZTEwLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmNlMTAuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGNlMTAudXBfcGx1cywgY2UxMC51cF9taW51cywgY2UxMC5kb3duX3BsdXMsIGNlMTAuZG93bl9taW51cykKCgpgYGAKCgpgYGB7cn0KCmRhblJlcjExLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vZGFuUmVyMTEuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9kYW5SZXIxMS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuZGFuUmVyMTEudHh0Li5saXN0Lm91dC5udW0iKQpkYW5SZXIxMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9kYW5SZXIxMS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vZGFuUmVyMTEuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5kYW5SZXIxMS50eHQuLmxpc3Qub3V0Lm51bSIpCmRhblJlcjExLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRhblJlcjExLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmRhblJlcjExLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShkYW5SZXIxMS51cF9wbHVzLCBkYW5SZXIxMS51cF9taW51cywgZGFuUmVyMTEuZG93bl9wbHVzLCBkYW5SZXIxMS5kb3duX21pbnVzKQoKCmBgYAoKYGBge3J9CgptbTEwLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vbW0xMC5leG9uLnVwX3BsdXMuYmVkLnNjb3JlLm1tMTAudHh0Li5saXN0Lm91dC5udW0iKQptbTEwLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9tbTEwLmV4b24uZG93bl9wbHVzLmJlZC5zY29yZS5tbTEwLnR4dC4ubGlzdC5vdXQubnVtIikKbW0xMC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9tbTEwLmV4b24udXBfbWludXMuYmVkLnNjb3JlLm1tMTAudHh0Li5saXN0Lm91dC5udW0iKQptbTEwLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vbW0xMC5leG9uLmRvd25fbWludXMuYmVkLnNjb3JlLm1tMTAudHh0Li5saXN0Lm91dC5udW0iKQptbTEwLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCm1tMTAuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKbW0xMC5UT1RBTCA8LSBwbG90X2RlbnNpdHkobW0xMC51cF9wbHVzLCBtbTEwLnVwX21pbnVzLCBtbTEwLmRvd25fcGx1cywgbW0xMC5kb3duX21pbnVzKQoKCmBgYAoKCmBgYHtyfQoKaGcxOS51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2hnMTkuZXhvbi51cF9wbHVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vaGcxOS5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuaGcxOS50eHQuLmxpc3Qub3V0Lm51bSIpCmhnMTkudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vaGcxOS5leG9uLnVwX21pbnVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2hnMTkuZXhvbi5kb3duX21pbnVzLmJlZC5zY29yZS5oZzE5LnR4dC4ubGlzdC5vdXQubnVtIikKaGcxOS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpoZzE5LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmhnMTkuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGhnMTkudXBfcGx1cywgaGcxOS51cF9taW51cywgaGcxOS5kb3duX3BsdXMsIGhnMTkuZG93bl9taW51cykKCgpgYGAKCgoKCmBgYHtyfQoKZG02LnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vZG02LmV4b24udXBfcGx1cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9kbTYuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmRtNi50eHQuLmxpc3Qub3V0Lm51bSIpCmRtNi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9kbTYuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vZG02LmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuZG02LnR4dC4ubGlzdC5vdXQubnVtIikKZG02LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmRtNi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpkbTYuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGRtNi51cF9wbHVzLCBkbTYudXBfbWludXMsIGRtNi5kb3duX3BsdXMsIGRtNi5kb3duX21pbnVzKQoKCmBgYAoKCgpgYGB7cn0KCmdhbEdhbDUudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9nYWxHYWw1LmV4b24udXBfcGx1cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2dhbEdhbDUuZXhvbi5kb3duX3BsdXMuYmVkLnNjb3JlLmdhbEdhbDUudHh0Li5saXN0Lm91dC5udW0iKQpnYWxHYWw1LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9Fdm9sdXRpb24vTnVtL2dhbEdhbDUuZXhvbi51cF9taW51cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9nYWxHYWw1LmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuZ2FsR2FsNS50eHQuLmxpc3Qub3V0Lm51bSIpCmdhbEdhbDUudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZ2FsR2FsNS5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpnYWxHYWw1LlRPVEFMIDwtIHBsb3RfZGVuc2l0eShnYWxHYWw1LnVwX3BsdXMsIGdhbEdhbDUudXBfbWludXMsIGdhbEdhbDUuZG93bl9wbHVzLCBnYWxHYWw1LmRvd25fbWludXMpCgoKYGBgCgoKCgoKYGBge3J9CgpzYWNDZXIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9zYWNDZXIzLmV4b24udXBfcGx1cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0V2b2x1dGlvbi9OdW0vc2FjQ2VyMy5leG9uLmRvd25fcGx1cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9zYWNDZXIzLmV4b24udXBfbWludXMuYmVkLnNjb3JlLnNhY0NlcjMudHh0Li5saXN0Lm91dC5udW0iKQpzYWNDZXIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRXZvbHV0aW9uL051bS9zYWNDZXIzLmV4b24uZG93bl9taW51cy5iZWQuc2NvcmUuc2FjQ2VyMy50eHQuLmxpc3Qub3V0Lm51bSIpCnNhY0Nlci51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpzYWNDZXIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKc2FjQ2VyLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShzYWNDZXIudXBfcGx1cywgc2FjQ2VyLnVwX21pbnVzLCBzYWNDZXIuZG93bl9wbHVzLCBzYWNDZXIuZG93bl9taW51cykKCgpgYGAKCgpgYGB7cn0KCmdhbEdhbDUudXBfcGx1c1ssIHJlcChQb3NpdGlvbiwgT2NjdXJyZW5jZXMpXQoKCmdhbEdhbDUudXAgPC0gbWVyZ2UoZ2FsR2FsNS5kb3duX3BsdXMsIGdhbEdhbDUuZG93bl9taW51cywgYnk9IlBvc2l0aW9uIikKCmdhbEdhbDUudXBbLCBPY2N1cnJlbmNlczo9IE9jY3VycmVuY2VzLnggKyBPY2N1cnJlbmNlcy55XQoKCmdhbEdhbDUudXAubWVsdCA8LSBnYWxHYWw1LnVwWywgcmVwKFBvc2l0aW9uLCBPY2N1cnJlbmNlcyldCmdhbEdhbDUudXAubWVsdCA8LSBkYXRhLnRhYmxlKGNiaW5kKGdhbEdhbDUudXAubWVsdCwgIlVwIikpCmNvbG5hbWVzKGdhbEdhbDUudXAubWVsdCkgPC0gYygiZGlzdCIsICJwb3MiKQoKZ2FsR2FsNS51cC5tZWx0JGRpc3QgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZ2FsR2FsNS51cC5tZWx0JGRpc3QpKQoKZ2dwbG90KGdhbEdhbDUudXAubWVsdCkgKyAKICBnZW9tX2xpbmUoYWVzKGRpc3QpLCBzdGF0PSJkZW5zaXR5IikKCgoKYGBgCgoKCmBgYHtyIH0KCgoKY2UxMC5UT1RBTFssIHNwZWNpZXM6PSJDLiBlbGVnYW5zIl0gCmhnMTkuVE9UQUxbLCBzcGVjaWVzOj0iSC4gc2FwaWVucyJdIAptbTEwLlRPVEFMWywgc3BlY2llczo9Ik0uIG11c2N1bHVzIl0KZGFuUmVyMTEuVE9UQUxbLCBzcGVjaWVzOj0iRC4gcmVyaW8iXSAKZG02LlRPVEFMWywgc3BlY2llczo9IkQuIG1lbGFub2dhc3RlciJdCmdhbEdhbDUuVE9UQUxbLCBzcGVjaWVzOj0iRy4gZ2FsbHVzIl0Kc2FjQ2VyLlRPVEFMWywgc3BlY2llczo9IlMuIGNlcmV2aXNpYWUiXQoKCnhlblRybzkuVE9UQUxbICwgc3BlY2llczo9IlguIHRyb3BpY2FsaXMiIF0KYW5vQ2FyMi5UT1RBTFsgICwgc3BlY2llczo9IkEuIGNhcm9saW5lbnNpcyIgXQpUQUlSMTAuVE9UQUxbICAsIHNwZWNpZXM6PSJBLiB0aGFsaWFuYSIgXQpzdXNTY3IxMS5UT1RBTFsgLCBzcGVjaWVzOj0iUy4gc2Nyb2ZhIl0KCkFsbC5zcGVjaWVzLlRPVEFMIDwtIHJiaW5kKGhnMTkuVE9UQUwsIG1tMTAuVE9UQUwsIGdhbEdhbDUuVE9UQUwsIGRhblJlcjExLlRPVEFMLCBhbm9DYXIyLlRPVEFMLCB4ZW5Ucm85LlRPVEFMLCAgc3VzU2NyMTEuVE9UQUwgICkKCgojQWxsLnNwZWNpZXMuVE9UQUwuYmlub21pYWwgPC0gY2JpbmQoQWxsLnNwZWNpZXMuVE9UQUwsICBHcnVucy50b3RhbFssIGJpbmNvbmYoT2NjdXJyZW5jZXMsIGhnMTkubmV4b25zKSBdKQojQWxsLnNwZWNpZXMuVE9UQUwuYmlub21pYWxbLCBtZWRpYW46PU5VTExdCgojQWxsLnNwZWNpZXMuVE9UQUwuYmlub21pYWxbICwgbWVkaWFuOj1tZWRpYW4oUG9pbnRFc3QpLCBieT1jKCJleG9uX3BvcyIsICJzcGVjaWVzIiApXQojQWxsLnNwZWNpZXMuVE9UQUwuYmlub21pYWxbLCBgOj1gKEVucnJpY2htZW50PVBvaW50RXN0L21lZGlhbiwgRW5ycmljaG1lbnRfbD1Mb3dlci9tZWRpYW4sIEVucnJpY2htZW50X3U9VXBwZXIvbWVkaWFuKV0KCgoKRmlnNi5CIDwtIGdncGxvdChBbGwuc3BlY2llcy5UT1RBTCkrCiAgICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3I9c3BlY2llcykpICsKICAgICMgICBnZW9tX3JpYmJvbihhZXMoeD1Qb3NpdGlvbiwgZmlsbD1zcGVjaWVzLCB5bWluPUVucnJpY2htZW50X2wsIHltYXg9RW5ycmljaG1lbnRfdSksIGFscGhhPTAuMykgKwogICAgeGxpbShjKC0zMDAsMzAwKSkgKwogICAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgdGhlbWVfYncoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpGaWc2LkIKCmBgYAoKCmBgYHtyfQoKQWxsLnNwZWNpZXMuVE9UQUwgPC0gcmJpbmQoY2UxMC5UT1RBTCwgZG02LlRPVEFMLCBUQUlSMTAuVE9UQUwgICkKCgoKZ2dwbG90KEFsbC5zcGVjaWVzLlRPVEFMKSsKICAgIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvcj1zcGVjaWVzKSkgKwogICAgeGxpbShjKC0zMDAsMzAwKSkgKwogICAgZ2d0aXRsZSggIk5vbi12ZXJ0ZWJyYXRlcyIpICsKICAgIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lX2J3KCkKYGBgCgoKCiMgRzQgYW5kIGdlbmUgc3RydWN0dXJlCgoKIyMgRmxhbmtpbmcgaW50cm9uIHNpemUgCgpIZXJlIHdlIGFuYWxpemVkIHRoZSBpbnRyb24gc2l6ZSBvZiBkaXN0cmlidXRpb24gb2YgZXhvbiB3aGljaCBhcmUgZmxhbmtlZCBieSBHNCAob24gYW4gMTAwbnQgd2luZG93KQoKCgpgYGB7cn0KCgppbnRyb25fc2l6ZV91cHN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV91cHN0cmVhbV8xMDBudF93aW5kb3cuYmVkLnBsdXNfc3RyYW5kX2dlbm9tZS5wbHVzX0c0cycpLCAgCiBmcmVhZCgnL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpKQoKaW50cm9uX3NpemVfZG93bnN0cmVhbV9ub25fdGVtcGxhdGUgIDwtIHJiaW5kKGZyZWFkKCcvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJyksICAKIGZyZWFkKCcvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0ludHJvbl9zaXplL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQubWludXNfc3RyYW5kX2dlbm9tZS5taW51c19HNHMnKSkKCgppbnRyb25fc2l6ZV91cHN0cmVhbV90ZW1wbGF0ZSAgPC0gcmJpbmQoZnJlYWQoJy9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X3Vwc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQucGx1c19zdHJhbmRfZ2Vub21lLm1pbnVzX0c0cycpLCAgCiBmcmVhZCgnL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfdXBzdHJlYW1fMTAwbnRfd2luZG93LmJlZC5taW51c19zdHJhbmRfZ2Vub21lLnBsdXNfRzRzJykpCgppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlICA8LSByYmluZChmcmVhZCgnL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9JbnRyb25fc2l6ZS9JbnRyb25zLmhnMTlfZG93bnN0cmVhbV8xMDBudF93aW5kb3cuYmVkLm1pbnVzX3N0cmFuZF9nZW5vbWUucGx1c19HNHMnKSwgIAogZnJlYWQoJy9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvSW50cm9uX3NpemUvSW50cm9ucy5oZzE5X2Rvd25zdHJlYW1fMTAwbnRfd2luZG93LmJlZC5wbHVzX3N0cmFuZF9nZW5vbWUubWludXNfRzRzJykpCgoKaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9InVwc3RyZWFtIiwgc3RyYW5kPSJub25fdGVtcGxhdGUiKSBdCmludHJvbl9zaXplX2Rvd25zdHJlYW1fbm9uX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9Im5vbl90ZW1wbGF0ZSIpIF0KaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGVbICwgYDo9YChleG9uX3Bvcz0idXBzdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQppbnRyb25fc2l6ZV9kb3duc3RyZWFtX3RlbXBsYXRlWyAsIGA6PWAoZXhvbl9wb3M9ImRvd25zdHJlYW0iLCBzdHJhbmQ9InRlbXBsYXRlIikgXQoKaW50cm9uX3NpemVfVE9UQUwgPC0gcmJpbmQoaW50cm9uX3NpemVfdXBzdHJlYW1fbm9uX3RlbXBsYXRlLCBpbnRyb25fc2l6ZV9kb3duc3RyZWFtX25vbl90ZW1wbGF0ZSwgaW50cm9uX3NpemVfdXBzdHJlYW1fdGVtcGxhdGUsIGludHJvbl9zaXplX2Rvd25zdHJlYW1fdGVtcGxhdGUgKQoKY29sbmFtZXMoaW50cm9uX3NpemVfVE9UQUwpIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiaW50cm9uX251bWJlciIsICJpbnRyb25fc2l6ZSIsICJUcmFuc2NyaXB0IiwgIkc0IiwgImV4b25fcG9zIiwgIlN0cmFuZCIgICkKCgpgYGAKCgoKYGBge3J9CmludHJvbl9zaXplX1RPVEFMWyAgRzQ+MCwgRzRfdHlwZTo9IldpdGggRzQiIF0KaW50cm9uX3NpemVfVE9UQUxbICBHND09MCwgRzRfdHlwZTo9IldpdGhvdXQgRzQiIF0KCmludHJvbl9zaXplX1RPVEFMJGV4b25fcG9zIDwtIGZhY3RvcihpbnRyb25fc2l6ZV9UT1RBTCRleG9uX3BvcywgbGV2ZWxzPWMoInVwc3RyZWFtIiwgImRvd25zdHJlYW0iKSkKCkZpZzMuQSA8LSBnZ3Bsb3QoZGF0YT1pbnRyb25fc2l6ZV9UT1RBTCkgKwogIGdlb21fYm94cGxvdCggYWVzKHg9RzRfdHlwZSwgeT1sb2cxMChpbnRyb25fc2l6ZSkgKSApICsKICBmYWNldF9ncmlkKCAuIH4gIGV4b25fcG9zICkgKwogIHhsYWIoIiIpKwogIHlsYWIoImxvZzEwKEludHJvbiBzaXplKSIpICsKICB0aGVtZV9idygpCgoKRmlnMy5BCgpgYGAKCgoKIyMgRXhvbiBudW1iZXIKCgpIZXJlIHdlIGV4cGxvcmVkIGhvdyBHNCBlbnJpY2htZW50cyBjaGFuZ2UgdGhvcnVnaCBnZW5lIGJvZHkKCgpgYGB7cn0KCgpleG9uc18xLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc18xX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc18xX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc18xLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc18xX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc18xLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zXzEuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zXzEudXBfcGx1cywgZXhvbnNfMS51cF9taW51cywgZXhvbnNfMS5kb3duX3BsdXMsIGV4b25zXzEuZG93bl9taW51cykgCgpgYGAKCgoKYGBge3J9CgoKZXhvbnNfMi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfMl9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfMl9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zXzJfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzIudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18yLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18yLnVwX3BsdXMsIGV4b25zXzIudXBfbWludXMsIGV4b25zXzIuZG93bl9wbHVzLCBleG9uc18yLmRvd25fbWludXMpIAoKYGBgCgoKCgpgYGB7cn0KCgoKZXhvbnNfMy51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfM19wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zXzNfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfMy5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfM19taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzMudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfMy5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc18zLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc18zLnVwX3BsdXMsIGV4b25zXzMudXBfbWludXMsIGV4b25zXzMuZG93bl9wbHVzLCBleG9uc18zLmRvd25fbWludXMpIAoKYGBgCgoKCgoKYGBge3J9CgoKCmV4b25zXzQudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zXzRfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zXzRfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc180X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zXzQuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zXzRfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc180LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zXzQuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfNC5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfNC51cF9wbHVzLCBleG9uc180LnVwX21pbnVzLCBleG9uc180LmRvd25fcGx1cywgZXhvbnNfNC5kb3duX21pbnVzKSAKCmBgYAoKCgoKCgpgYGB7cn0KCgoKZXhvbnNfbWlkZGxlLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc19taWRkbGVfcGx1c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWlkZGxlX3BsdXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc19taWRkbGVfbWludXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWlkZGxlLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc19taWRkbGVfbWludXNfc3RyYW5kX2Rvd25zdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taWRkbGUudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZXhvbnNfbWlkZGxlLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCmV4b25zX21pZGRsZS5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZXhvbnNfbWlkZGxlLnVwX3BsdXMsIGV4b25zX21pZGRsZS51cF9taW51cywgZXhvbnNfbWlkZGxlLmRvd25fcGx1cywgZXhvbnNfbWlkZGxlLmRvd25fbWludXMpIAoKYGBgCgoKCgoKYGBge3J9CgoKCmV4b25zX21pbnVzNC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzNF9wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzNC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXM0X21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXM0LnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzNC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czQuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzNC51cF9wbHVzLCBleG9uc19taW51czQudXBfbWludXMsIGV4b25zX21pbnVzNC5kb3duX3BsdXMsIGV4b25zX21pbnVzNC5kb3duX21pbnVzKSAKCmBgYAoKCgoKYGBge3J9CgoKCmV4b25zX21pbnVzMy51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXMzX3BsdXNfc3RyYW5kX3Vwc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLmRvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzM19wbHVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXMzX21pbnVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMy5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9leG9uX251bWJlcnMvZXhvbnNfbWludXMzX21pbnVzX3N0cmFuZF9kb3duc3RyZWFtLnR4dC5zY29yZS5HNC5iZWQubGlzdC5vdXQubnVtIikKZXhvbnNfbWludXMzLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmV4b25zX21pbnVzMy5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgpleG9uc19taW51czMuVE9UQUwgPC0gcGxvdF9kZW5zaXR5KGV4b25zX21pbnVzMy51cF9wbHVzLCBleG9uc19taW51czMudXBfbWludXMsIGV4b25zX21pbnVzMy5kb3duX3BsdXMsIGV4b25zX21pbnVzMy5kb3duX21pbnVzKSAKCmBgYAoKCgoKCmBgYHtyfQoKCgpleG9uc19taW51czIudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMl9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc19taW51czJfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMl9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czIuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMl9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czIuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMyLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czIudXBfcGx1cywgZXhvbnNfbWludXMyLnVwX21pbnVzLCBleG9uc19taW51czIuZG93bl9wbHVzLCBleG9uc19taW51czIuZG93bl9taW51cykgCgpgYGAKCgoKCmBgYHtyfQoKCgpleG9uc19taW51czEudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9wbHVzX3N0cmFuZF91cHN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL2V4b25fbnVtYmVycy9leG9uc19taW51czFfcGx1c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfdXBzdHJlYW0udHh0LnNjb3JlLkc0LmJlZC5saXN0Lm91dC5udW0iKQpleG9uc19taW51czEuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvZXhvbl9udW1iZXJzL2V4b25zX21pbnVzMV9taW51c19zdHJhbmRfZG93bnN0cmVhbS50eHQuc2NvcmUuRzQuYmVkLmxpc3Qub3V0Lm51bSIpCmV4b25zX21pbnVzMS51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpleG9uc19taW51czEuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKZXhvbnNfbWludXMxLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShleG9uc19taW51czEudXBfcGx1cywgZXhvbnNfbWludXMxLnVwX21pbnVzLCBleG9uc19taW51czEuZG93bl9wbHVzLCBleG9uc19taW51czEuZG93bl9taW51cykgCgpgYGAKCgoKCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE1fQpleG9uc18xLlRPVEFMWywgZXhvbl9udW06PSIxIl0KZXhvbnNfMi5UT1RBTFssIGV4b25fbnVtOj0iMiJdCmV4b25zXzMuVE9UQUxbLCBleG9uX251bTo9IjMiXQpleG9uc180LlRPVEFMWywgZXhvbl9udW06PSI0Il0KCmV4b25zX21pZGRsZS5UT1RBTFssIGV4b25fbnVtOj0ibWlkZGxlIl0KCmV4b25zX21pbnVzNC5UT1RBTFssIGV4b25fbnVtOj0iLTQiXQpleG9uc19taW51czMuVE9UQUxbLCBleG9uX251bTo9Ii0zIl0KZXhvbnNfbWludXMyLlRPVEFMWywgZXhvbl9udW06PSItMiJdCmV4b25zX21pbnVzMS5UT1RBTFssIGV4b25fbnVtOj0iLTEiXQoKCmV4b25fbnVtLlRPVEFMIDwtIHJiaW5kKGV4b25zXzEuVE9UQUwsIGV4b25zXzIuVE9UQUwsIGV4b25zXzMuVE9UQUwsIGV4b25zXzQuVE9UQUwsIGV4b25zX21pZGRsZS5UT1RBTCwgZXhvbnNfbWludXM0LlRPVEFMLCBleG9uc19taW51czMuVE9UQUwsIGV4b25zX21pbnVzMi5UT1RBTCwgZXhvbnNfbWludXMxLlRPVEFMKQoKCmV4b25fbnVtLlRPVEFMJGV4b25fbnVtIDwtIGZhY3RvcihleG9uX251bS5UT1RBTCRleG9uX251bSwgbGV2ZWxzID0gYygiMSIsICIyIiwgIjMiLCAiNCIsICJtaWRkbGUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiICkpCgpnZ3Bsb3QoZXhvbl9udW0uVE9UQUwpKwogICAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQpKSArCiAgICB4bGltKGMoLTMwMCwzMDApKSArCiAgICBmYWNldF9ncmlkKCBleG9uX3BvcyB+IGV4b25fbnVtICAgKSArCiAgdGhlbWVfYncoKQoKYGBgCgoKCgoKCgoKCgoKCiMgRzQgc2VxCgoKSGVyZSB3ZSBkaXN0cmlidXRpb24gb2YgRzQtc2VxIGV4cGVyaW1lbnRzICAKCgoKYGBge3J9CgoKRzRfMjAxOS5LLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LksuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxOS5LLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LksuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5LLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkuSy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuSy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgpHNF8yMDE5LksuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS5LLlExX3VwX3BsdXMsIEc0XzIwMTkuSy5RMl91cF9wbHVzLCBHNF8yMDE5LksuUTNfdXBfcGx1cywgRzRfMjAxOS5LLlE0X3VwX3BsdXMpCkc0XzIwMTkuSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxOS5LLlExX3VwX21pbnVzLCBHNF8yMDE5LksuUTJfdXBfbWludXMsIEc0XzIwMTkuSy5RM191cF9taW51cywgRzRfMjAxOS5LLlE0X3VwX21pbnVzKQpHNF8yMDE5LksuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LksuUTFfZG93bl9wbHVzLCBHNF8yMDE5LksuUTJfZG93bl9wbHVzLCBHNF8yMDE5LksuUTNfZG93bl9wbHVzLCBHNF8yMDE5LksuUTRfZG93bl9wbHVzKQpHNF8yMDE5LksuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5LLlExX2Rvd25fbWludXMsIEc0XzIwMTkuSy5RMl9kb3duX21pbnVzLCBHNF8yMDE5LksuUTNfZG93bl9taW51cywgRzRfMjAxOS5LLlE0X2Rvd25fbWludXMpCkc0XzIwMTkuSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxOS5LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LksuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LksuUXMubWludXMubGlzdCwgRzRfMjAxOS5LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LksuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE5Lksud2luZG93X2xlbikKCgpnZ3Bsb3QoRzRfMjAxOS5LLlFzLnRvdGFsKSsKICBnZW9tX2xpbmUoYWVzKHg9UG9zaXRpb24seT1FbnJyaWNobWVudCwgY29sb3VyPVEpKSArCiAgeGxpbShjKC0yMDAsMjAwKSkgKwogIGZhY2V0X2dyaWQoIC4gfiBleG9uX3BvcyApICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSArCiAgdGhlbWVfYncoKSArIAogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgpgYGAKCgoKCgoKCmBgYHtyfQoKCkc0XzIwMTkuUERTLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkuUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKRzRfMjAxOS5QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5LlBEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkuUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LlBEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkuUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX3VwX3BsdXMsIEc0XzIwMTkuUERTLlEyX3VwX3BsdXMsIEc0XzIwMTkuUERTLlEzX3VwX3BsdXMsIEc0XzIwMTkuUERTLlE0X3VwX3BsdXMpCkc0XzIwMTkuUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5LlBEUy5RMV91cF9taW51cywgRzRfMjAxOS5QRFMuUTJfdXBfbWludXMsIEc0XzIwMTkuUERTLlEzX3VwX21pbnVzLCBHNF8yMDE5LlBEUy5RNF91cF9taW51cykKRzRfMjAxOS5QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LlBEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTkuUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE5LlBEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTkuUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkuUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTkuUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTkuUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5LlBEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LlBEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE5LlBEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE5LlBEUy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE5LlBEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKYGBge3J9CgoKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCgpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCmBgYAoKCgpgYGB7cn0KRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfdXBfcGx1cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RMl91cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X3VwX21pbnVzKQpHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkudGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5RM19kb3duX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTFfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTNfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5QRFMuUTRfZG93bl9taW51cykKRzRfMjAxOS50ZW1wbGF0ZS5QRFMud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkudGVtcGxhdGUuUERTLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4pCmBgYAoKCgpgYGB7cn0KRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV91cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF91cF9wbHVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV91cF9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTNfdXBfbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF91cF9taW51cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlExX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlE0X2Rvd25fcGx1cykKRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RMV9kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMuUTJfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5RNF9kb3duX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5QRFMud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTkubm9uX3RlbXBsYXRlLlBEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbikKYGBgCgoKYGBge3J9CgoKCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCA8LSByYmluZChHNF8yMDE5LnRlbXBsYXRlLlBEUy5Rcy50b3RhbCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwpLzIKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsWywgU3RyYW5kOj1yZXAoYygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgCiAgCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgpgYGB7cn0KCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkUSwgIGZyb20gPWMoMTo0KSwgdG8gPWMoIlExIiwgIlEyIiwgIlEzIiwgIlE0IikpCgoKZ2dwbG90KEc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLlBEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBTdHJhbmQgfiBleG9uX3BvcyApICsKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lX2J3KCkgICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpCgoKCmBgYAoKCgpgYGB7cn0KRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsW1N0cmFuZD09Ik5vbi10ZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iVGVtcGxhdGUiXQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWxbU3RyYW5kPT0iVGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9Ik5vbi10ZW1wbGF0ZSJdCgoKICAKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuUERTLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwkbmV3X1N0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCmdncGxvdChHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5QRFMuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTE1MCwxNTApKSArCiAgZmFjZXRfZ3JpZCggbmV3X1N0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCmBgYAoKCgoKCgoKCgoKCgoKCmBgYHtyfQoKCkc0XzIwMTkudGVtcGxhdGUuSy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkudGVtcGxhdGUuSy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTNfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCgpHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkudGVtcGxhdGUuSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxOS50ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX3BsdXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX3BsdXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl91cF9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfdXBfcGx1cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX3BsdXMpCkc0XzIwMTkudGVtcGxhdGUuSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX3VwX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTJfdXBfbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RM191cF9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X3VwX21pbnVzKQpHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE5LnRlbXBsYXRlLksuUTFfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTJfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9wbHVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTRfZG93bl9wbHVzKQpHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS50ZW1wbGF0ZS5LLlExX2Rvd25fbWludXMsIEc0XzIwMTkudGVtcGxhdGUuSy5RMl9kb3duX21pbnVzLCBHNF8yMDE5LnRlbXBsYXRlLksuUTNfZG93bl9taW51cywgRzRfMjAxOS50ZW1wbGF0ZS5LLlE0X2Rvd25fbWludXMpCkc0XzIwMTkudGVtcGxhdGUuSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5LnRlbXBsYXRlLksuUXMucGx1cy51cC5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMubGlzdCwgRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5LnRlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0LCB3aW5kb3dfbGVuKQpgYGAKCgoKYGBge3J9Ckc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV91cF9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTNfdXBfcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF91cF9wbHVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlExX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX3VwX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlE0X3VwX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV9kb3duX3BsdXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTJfZG93bl9wbHVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEzX2Rvd25fcGx1cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF9kb3duX3BsdXMpCkc0XzIwMTkubm9uX3RlbXBsYXRlLksuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RMV9kb3duX21pbnVzLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlEyX2Rvd25fbWludXMsIEc0XzIwMTkubm9uX3RlbXBsYXRlLksuUTNfZG93bl9taW51cywgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5RNF9kb3duX21pbnVzKQpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy5taW51cy5saXN0LCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbikKYGBgCgoKYGBge3J9CgpHNF8yMDE5LnRlbXBsYXRlLksuUXMudG90YWwKRzRfMjAxOS5ub25fdGVtcGxhdGUuSy5Rcy50b3RhbAoKCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWwgPC0gcmJpbmQoRzRfMjAxOS50ZW1wbGF0ZS5LLlFzLnRvdGFsLCBHNF8yMDE5Lm5vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsKS8yCkc0XzIwMTkudGVtcGxhdGVfbm9uX3RlbXBsYXRlLksuUXMudG90YWxbLCBTdHJhbmQ6PXJlcChjKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiKSwgZWFjaD1oYWxmX24pIF0KICAKICAKICAKICAKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFN0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCiAgCmBgYAoKCgoKCgoKYGBge3J9CgoKRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCRRIDwtIG1hcHZhbHVlcyhHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsW1N0cmFuZD09Ik5vbi10ZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iVGVtcGxhdGUiXQpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsW1N0cmFuZD09IlRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJOb24tdGVtcGxhdGUiXQoKCgpHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE5LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5LLlFzLnRvdGFsJG5ld19TdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgpnZ3Bsb3QoRzRfMjAxOS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuSy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMTUwLDE1MCkpICsKICBmYWNldF9ncmlkKCBuZXdfU3RyYW5kIH4gZXhvbl9wb3MgKSArCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZV9idygpICArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKCmBgYAoKCgoKCgoKCgoKYGBge3J9CiMyMDE1CgpHNF8yMDE1Lk5hX1BEUy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX1BEUy5RMV91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUuTmFfUERTLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9QRFMuUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfUERTLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgoKCkc0XzIwMTUuTmFfUERTLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfUERTLlExX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEyX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEzX3VwX3BsdXMsIEc0XzIwMTUuTmFfUERTLlE0X3VwX3BsdXMpCkc0XzIwMTUuTmFfUERTLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV91cF9taW51cywgRzRfMjAxNS5OYV9QRFMuUTJfdXBfbWludXMsIEc0XzIwMTUuTmFfUERTLlEzX3VwX21pbnVzLCBHNF8yMDE1Lk5hX1BEUy5RNF91cF9taW51cykKRzRfMjAxNS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX1BEUy5RMV9kb3duX3BsdXMsIEc0XzIwMTUuTmFfUERTLlEyX2Rvd25fcGx1cywgRzRfMjAxNS5OYV9QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE1Lk5hX1BEUy5RNF9kb3duX3BsdXMpCkc0XzIwMTUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlEyX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlEzX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTUuTmFfUERTLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1Lk5hX1BEUy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS5OYV9QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE1Lk5hX1BEUy5Rcy5taW51cy5saXN0LCBHNF8yMDE1Lk5hX1BEUy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0LCBHNF8yMDE1Lk5hX1BEUy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE1Lk5hX1BEUy5Rcy50b3RhbCkrCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLHk9RW5ycmljaG1lbnQsIGNvbG91cj1RKSkgKwogIHhsaW0oYygtMjAwLDIwMCkpICsKICBmYWNldF9ncmlkKCAuIH4gZXhvbl9wb3MgKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSkgKwogIHRoZW1lX2J3KCkgKyAKICBsYWJzKGNvbG91ciA9ICJTcGxpY2Ugc2l0ZSBzdHJlZ3RoIHF1YXJ0aWxlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKYGBgCgoKCgoKCgpgYGB7cn0KRzRfMjAxNS5OYV9LLlExX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlE0X3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lk5hX0suUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5OYV9LLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUuTmFfSy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lk5hX0suUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5OYV9LLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlEzX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5OYV9LLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgoKCgoKCkc0XzIwMTUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX0suUTFfdXBfcGx1cywgRzRfMjAxNS5OYV9LLlEyX3VwX3BsdXMsIEc0XzIwMTUuTmFfSy5RM191cF9wbHVzLCBHNF8yMDE1Lk5hX0suUTRfdXBfcGx1cykKRzRfMjAxNS5OYV9LLlFzLm1pbnVzLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX0suUTFfdXBfbWludXMsIEc0XzIwMTUuTmFfSy5RMl91cF9taW51cywgRzRfMjAxNS5OYV9LLlEzX3VwX21pbnVzLCBHNF8yMDE1Lk5hX0suUTRfdXBfbWludXMpCkc0XzIwMTUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUuTmFfSy5RMV9kb3duX3BsdXMsIEc0XzIwMTUuTmFfSy5RMl9kb3duX3BsdXMsIEc0XzIwMTUuTmFfSy5RM19kb3duX3BsdXMsIEc0XzIwMTUuTmFfSy5RNF9kb3duX3BsdXMpCkc0XzIwMTUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lk5hX0suUTFfZG93bl9taW51cywgRzRfMjAxNS5OYV9LLlEyX2Rvd25fbWludXMsIEc0XzIwMTUuTmFfSy5RM19kb3duX21pbnVzLCBHNF8yMDE1Lk5hX0suUTRfZG93bl9taW51cykKRzRfMjAxNS5OYV9LLndpbmRvd19sZW4gPSAyMDAwCgpHNF8yMDE1Lk5hX0suUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTUuTmFfSy5Rcy5taW51cy5saXN0LCBHNF8yMDE1Lk5hX0suUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QsIEc0XzIwMTUuTmFfSy53aW5kb3dfbGVuKQoKCmdncGxvdChHNF8yMDE1Lk5hX0suUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTIwMCwyMDApKSArCiAgZmFjZXRfZ3JpZCggLiB+IGV4b25fcG9zICkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSkpICsKICB0aGVtZV9idygpICsgCiAgbGFicyhjb2xvdXIgPSAiU3BsaWNlIHNpdGUgc3RyZWd0aCBxdWFydGlsZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCmBgYAoKCgoKCgoKYGBge3J9CgoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF91cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKCgpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9QRFNfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMS5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xNC5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfUERTX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX1BEU19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCgoKYGBgCgoKCmBgYHtyfQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5wbHVzLnVwLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM191cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF91cF9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEyX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM191cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfdXBfbWludXMpCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlEzX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMV9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RM19kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5RNF9kb3duX21pbnVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwgPC0gZ2V0X3RvdGFsX1FzKEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy51cC5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl91cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X3VwX3BsdXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX3VwX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfdXBfbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RM191cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X3VwX21pbnVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy5kb3duLmxpc3QgPC0gbGlzdChHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTFfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTJfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTRfZG93bl9wbHVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlExX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUTNfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlE0X2Rvd25fbWludXMpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsIDwtIGdldF90b3RhbF9RcyhHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMucGx1cy51cC5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnBsdXMuZG93bi5saXN0LCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9QRFMuUXMubWludXMuZG93bi5saXN0LCB3aW5kb3dfbGVuKQpgYGAKCgpgYGB7cn0KCkc0XzIwMTUudGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbAoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCA8LSByYmluZChHNF8yMDE1LnRlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsKQogIApoYWxmX24gPC0gbnJvdyhHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwpLzIKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsWywgU3RyYW5kOj1yZXAoYygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgCiAgCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbCRTdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKICAKYGBgCgoKCgpgYGB7cn0KCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJFEsICBmcm9tID1jKDE6NCksIHRvID1jKCJRMSIsICJRMiIsICJRMyIsICJRNCIpKQpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWxbU3RyYW5kPT0iTm9uLXRlbXBsYXRlIiAsIG5ld19TdHJhbmQ6PSJUZW1wbGF0ZSJdCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX1BEUy5Rcy50b3RhbFtTdHJhbmQ9PSJUZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iTm9uLXRlbXBsYXRlIl0KCgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfUERTLlFzLnRvdGFsJG5ld19TdHJhbmQgPC0gIGZhY3RvcihHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwkbmV3X1N0cmFuZCwgbGV2ZWxzPWMoIlRlbXBsYXRlIiwgIk5vbi10ZW1wbGF0ZSIgKSkKCmdncGxvdChHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9QRFMuUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTMwMCwzMDApKSArCiAgZmFjZXRfZ3JpZCggbmV3X1N0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpgYGAKCgoKCgoKCgpgYGB7cn0KCgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMl91cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX3VwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM191cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX3BsdXMucTMuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfdXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX3VwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLnVwX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM191cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi51cF9taW51cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfdXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24udXBfbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTIuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMy5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF9kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKCgpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTFfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnExLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEyLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTRfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnE0LmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlExX2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTJfZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fcGx1cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19wbHVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM19kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9wbHVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX3BsdXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX3BsdXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfcGx1c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCgoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTEuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKCIvVXNlcnMvZ3A3L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE1L2V4b24uZG93bl9taW51cy5xMi5iZWQuc2NvcmUuR1NFNjM4NzRfTmFfS19taW51c19oaXRzX2ludGVyc2VjdC5iZWQuYmVkLmxpc3Qub3V0Lm51bSIpCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTNfZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoIi9Vc2Vycy9ncDcvR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTUvZXhvbi5kb3duX21pbnVzLnEzLmJlZC5zY29yZS5HU0U2Mzg3NF9OYV9LX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZC5iZWQubGlzdC5vdXQubnVtIikKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF9kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZSgiL1VzZXJzL2dwNy9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxNS9leG9uLmRvd25fbWludXMucTQuYmVkLnNjb3JlLkdTRTYzODc0X05hX0tfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkLmJlZC5saXN0Lm91dC5udW0iKQoKCgoKCmBgYAoKCgpgYGB7cn0KRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV91cF9wbHVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfdXBfcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX3VwX3BsdXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF91cF9wbHVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0suUXMubWludXMubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV91cF9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX3VwX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTNfdXBfbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF91cF9taW51cykKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnBsdXMuZG93bi5saXN0IDwtIGxpc3QoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlExX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fcGx1cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlE0X2Rvd25fcGx1cykKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RMV9kb3duX21pbnVzLCBHNF8yMDE1LnRlbXBsYXRlLk5hX0suUTJfZG93bl9taW51cywgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fbWludXMsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5RNF9kb3duX21pbnVzKQpHNF8yMDE1LnRlbXBsYXRlLk5hX0sud2luZG93X2xlbiA9IDIwMDAKCkc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnBsdXMudXAubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmxpc3QsIEc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCwgd2luZG93X2xlbikKYGBgCgoKCmBgYHtyfQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLnBsdXMudXAubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfdXBfcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX3VwX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfdXBfcGx1cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5taW51cy5saXN0IDwtIGxpc3QoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMV91cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl91cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM191cF9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RNF91cF9taW51cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9wbHVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEyX2Rvd25fcGx1cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RM19kb3duX3BsdXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9wbHVzKQpHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlFzLm1pbnVzLmRvd24ubGlzdCA8LSBsaXN0KEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTFfZG93bl9taW51cywgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5RMl9kb3duX21pbnVzLCBHNF8yMDE1Lm5vbl90ZW1wbGF0ZS5OYV9LLlEzX2Rvd25fbWludXMsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUTRfZG93bl9taW51cykKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy53aW5kb3dfbGVuID0gMjAwMAoKRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCA8LSBnZXRfdG90YWxfUXMoRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLnVwLmxpc3QsIEc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMubWludXMubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5wbHVzLmRvd24ubGlzdCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy5taW51cy5kb3duLmxpc3QsIHdpbmRvd19sZW4pCmBgYAoKCmBgYHtyfQoKRzRfMjAxNS50ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsCkc0XzIwMTUubm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwKCgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsIDwtIHJiaW5kKEc0XzIwMTUudGVtcGxhdGUuTmFfSy5Rcy50b3RhbCwgRzRfMjAxNS5ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCkKICAKaGFsZl9uIDwtIG5yb3coRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCkvMgpHNF8yMDE1LnRlbXBsYXRlX25vbl90ZW1wbGF0ZS5OYV9LLlFzLnRvdGFsWywgU3RyYW5kOj1yZXAoYygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiksIGVhY2g9aGFsZl9uKSBdCiAgCiAgCiAgCiAgCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRTdHJhbmQsIGxldmVscz1jKCJUZW1wbGF0ZSIsICJOb24tdGVtcGxhdGUiICkpCgogIApgYGAKCgoKCmBgYHtyfQoKCkc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwkUSA8LSBtYXB2YWx1ZXMoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRRLCAgZnJvbSA9YygxOjQpLCB0byA9YygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiKSkKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbFtTdHJhbmQ9PSJOb24tdGVtcGxhdGUiICwgbmV3X1N0cmFuZDo9IlRlbXBsYXRlIl0KRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbFtTdHJhbmQ9PSJUZW1wbGF0ZSIgLCBuZXdfU3RyYW5kOj0iTm9uLXRlbXBsYXRlIl0KCgoKRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRuZXdfU3RyYW5kIDwtICBmYWN0b3IoRzRfMjAxNS50ZW1wbGF0ZV9ub25fdGVtcGxhdGUuTmFfSy5Rcy50b3RhbCRuZXdfU3RyYW5kLCBsZXZlbHM9YygiVGVtcGxhdGUiLCAiTm9uLXRlbXBsYXRlIiApKQoKZ2dwbG90KEc0XzIwMTUudGVtcGxhdGVfbm9uX3RlbXBsYXRlLk5hX0suUXMudG90YWwpKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbix5PUVucnJpY2htZW50LCBjb2xvdXI9USkpICsKICB4bGltKGMoLTMwMCwzMDApKSArCiAgZmFjZXRfZ3JpZCggbmV3X1N0cmFuZCB+IGV4b25fcG9zICkgKwogIGxhYnMoY29sb3VyID0gIlNwbGljZSBzaXRlIHN0cmVndGggcXVhcnRpbGUiKSArCiAgdGhlbWVfYncoKSAgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikKCgpgYGAKCgoKCiMgS0NsIFJOQS1zZXEKCgpBcyBLKyBpcyBrbm93biB0byBzdGFiaWxpemUgRzQsIHdlIGFuYWxpemVkIChSTkEtc2VxIGRhdGEpW2h0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvYmlvcHJvamVjdC9QUkpFQjE5NDUxXSBjb21taW5nIGZyb20gbmV1cm9ucyBhZnRlciA0LWhvdXIgS0NsLWluZHVzZWQgZGVwb2xhcml6YXRpb24uIAoKCgoKCgpgYGB7cn0KCgpLQ0xfaHVtYW5fdXBzdHJlYW0gPC0gZnJlYWQoIi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiICApCmNvbG5hbWVzKEtDTF9odW1hbl91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfaHVtYW5fZG93bnN0cmVhbTwtIGZyZWFkKCIuL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCmNvbG5hbWVzKEtDTF9odW1hbl9kb3duc3RyZWFtKSA8LWMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiICApCgoKS0NMX2h1bWFuIDwtICBtZXJnZShLQ0xfaHVtYW5fdXBzdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwKICAgICAgICAgICAgICAgICAgICBLQ0xfaHVtYW5fZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiKSBdLCAKICAgICAgICAgICAgICAgICAgICBieT1jKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IikgKQoKS0NMX2h1bWFuWyhHNC54PjAgfCBHNC55PjAgKSwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQpLQ0xfaHVtYW5bKEc0Lng9PTAgJiBHNC55PT0wICksIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KS0NMX2h1bWFuJEc0X2JvbCA8LSBmYWN0b3IoS0NMX2h1bWFuJEc0X2JvbCwgbGV2ZWxzPWMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikgKQoKCktDTF9odW1hbltlbmQgLSBzdGFydCA+IDMwLCBleG9uOj0iZXhvbiIgXQpLQ0xfaHVtYW5bZW5kIC0gc3RhcnQgPD0gMzAsIGV4b246PSJtaWNyb2V4b24iIF0KCnNpemUudmFyPTAuNQphbHBoYS52YXI9MC4yNQoKIGdncGxvdChkYXRhPUtDTF9odW1hblsgVHlwZT09IkNFIixdKSArCiAgZ2VvbV9wb2ludCggYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJncmV5IiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InNreWJsdWUiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k8KC0wLjEpICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InJlZCIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIHhsaW0oYygtMC44LCAwLjgpKSArCiAgZmFjZXRfZ3JpZCggLiB+IEc0X2JvbCAgKSArCiAgeGxhYigiRGVsdGFQU0kgKENvbnRyb2wgLSBLQ2wpIikgKwogIHRoZW1lX2J3KCkKCgoKCmBgYAoKClRvIGhpZ2hsaWdodCBOUlhOMiwgU0hBTksxIGFuZCBSQk0xMCB3ZSB1c2VkIGJpb21hUnQgdG8gZmluZCB0aGUgZ2VuZSBuYW1lIHRvIEVuc2VtYmwgSUQgY29ycmVzcG9uZGVuY2UgCgoKYGBge3J9CmxpYnJhcnkoYmlvbWFSdCkKCmVuc2VtYmwgPSB1c2VFbnNlbWJsKGJpb21hcnQ9ImVuc2VtYmwiLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiKQoKCktDTF9odW1hblsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCAgXQoKCktDTF9odW1hblssIENvb3Jkczo9cGFzdGUoY2hyb20sIHBhc3RlKHN0YXJ0LCBlbmQsIHNlcCA9ICItIiksIHN0cmFuZCwgc2VwPSI6IiApXQoKCndoaXBwZXQuamxzLmV4b25zLmhnMTkgPC0gIGZyZWFkKCIuL0tDTC93aGlwcGV0Lmpscy5leG9ucy50YWIiKQoKS0NMX2h1bWFuX0NFIDwtIG1lcmdlKEtDTF9odW1hbltUeXBlPT0iQ0UiLCBdLCB3aGlwcGV0Lmpscy5leG9ucy5oZzE5LCBieS54PSJDb29yZHMiLCBieS55PSJQb3RlbnRpYWxfRXhvbiIpCgoKS0NMX2h1bWFuX0NFWyAsIGVuc2VtYmxfZ2VuZV9pZDo9dmFwcGx5KHN0cnNwbGl0KEtDTF9odW1hbl9DRSRHZW5lLCAiLiIsIGZpeGVkID0gVFJVRSksICJbIiwgIiIsIDEpXQoKS0NMX2h1bWFuX0NFX2dlbmVzIDwtICBkYXRhLnRhYmxlKGdldEJNKGF0dHJpYnV0ZXM9YygnZW5zZW1ibF9nZW5lX2lkJywgIndpa2lnZW5lX2Rlc2NyaXB0aW9uIiwgImhnbmNfc3ltYm9sIiksZmlsdGVycyA9ICdlbnNlbWJsX2dlbmVfaWQnLCB2YWx1ZXMgPSB1bmlxdWUodmFwcGx5KHN0cnNwbGl0KEtDTF9odW1hbl9DRSRHZW5lLCAiLiIsIGZpeGVkID0gVFJVRSksICJbIiwgIiIsIDEpKSAsIG1hcnQgPSBlbnNlbWJsKSkKCgpLQ0xfaHVtYW5fQ0UgPC0gIG1lcmdlKEtDTF9odW1hbl9DRSwgS0NMX2h1bWFuX0NFX2dlbmVzLCBieT0iZW5zZW1ibF9nZW5lX2lkIikKCgoKCgoKCgoKCgpLQ0xfaHVtYW5fQ0VbIGhnbmNfc3ltYm9sPT0iR1JJTjEiLCAgXVsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC44NSwgIF0KCktDTF9odW1hbl9DRVsgaGduY19zeW1ib2w9PSJOUlhOMiIsICBdWyBUeXBlPT0iQ0UiJiBEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT4wLjksICBdCktDTF9odW1hbl9DRVsgaGduY19zeW1ib2w9PSJTSEFOSzEiLCAgXVsgVHlwZT09IkNFIiYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC44NSwgIF0KS0NMX2h1bWFuX0NFWyBoZ25jX3N5bWJvbD09IlJCTTEwIiwgIF1bIFR5cGU9PSJDRSImIERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5PjAuOSwgIF0KCgoKCgogIAoKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD00fQpsaWJyYXJ5KCJnZ3JlcGVsIikKCnZhbGlkYXRpb25fZXhvbnMgPC1jKCJjaHIxOjExMDczNDU5NC0xMTA3MzQ4MzU6KyIsICJjaHIxOToxNzczMTUwMi0xNzczMTUzMTotIiwgImNocjExOjIwMDcyODM1LTIwMDcyODc5OisiKQoKRmlnNS5BIDwtIGdncGxvdChkYXRhPUtDTF9odW1hblsgVHlwZT09IkNFIixdKSArCiAgZ2VvbV9wb2ludCggYWVzKHg9LURlbHRhUHNpLCB5PVByb2JhYmlsaXR5KSwgY29sb3VyPSJncmV5IiwgYWxwaGE9YWxwaGEudmFyLCBzaXplPXNpemUudmFyKSArCiAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InNreWJsdWUiLCBhbHBoYT1hbHBoYS52YXIsIHNpemU9c2l6ZS52YXIpICsKICAgZ2VvbV9wb2ludChkYXRhPUtDTF9odW1hbltUeXBlPT0iQ0UiICYgRGVsdGFQc2k8KC0wLjEpICYgUHJvYmFiaWxpdHk+MC45LCBdLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLCBjb2xvdXI9InJlZCIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT1zaXplLnZhcikgKwogIHhsaW0oYygtMC44LCAwLjgpKSArCiAgZmFjZXRfZ3JpZCggLiB+IEc0X2JvbCAgKSArCiAgeGxhYigiRGVsdGFQU0kgKENvbnRyb2wgLSBLQ2wpIikgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fcG9pbnQoZGF0YT1LQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIF0sIGFlcyh4PS1EZWx0YVBzaSwgeT1Qcm9iYWJpbGl0eSksIGNvbG91cj0iYmx1ZSIsIGFscGhhPWFscGhhLnZhciwgc2l6ZT0yKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBLQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIF0sCiAgICAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLCBhZXMoeD0tRGVsdGFQc2ksIHk9UHJvYmFiaWxpdHkpLAogICAgICAgICAgICAgICAgICBudWRnZV95ICAgICAgPSAzLAogICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gICAgPSAieCIsCiAgICAgICAgICAgICAgICAgIGFuZ2xlICAgICAgICA9IDkwLAogICAgICAgICAgICAgICAgICB2anVzdCAgICAgICAgPSAxLAogICAgICAgICAgICAgICAgICBzZWdtZW50LnNpemUgPSAwLjIsCiAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLjA1LAogICAgICAgICAgICAgICAgICBsYWJlbD1LQ0xfaHVtYW5fQ0VbQ29vcmRzICVpbiUgdmFsaWRhdGlvbl9leG9ucyAsIGhnbmNfc3ltYm9sXSkgKwogIHlsaW0oYygwLjUsIDEuMTUpKQoKRmlnNS5BCmBgYAoKClRvIGFuYWx5c2UgYWxsIHRoZSBXaGlwcGV0IG5vZGUgdHlwZXMsIHdlIGNhbGN1bGF0ZSB0aGUgb2RkLXJhdGlvcyBvZiBiZWluZyBkaWZmZXJlbnRpYWxseSBpbmNsdWRlZCBnaXZlbiB0aGUgRzQgcHJlc2VuY2Ugb3IgYWJzZW5jZSAKCgpgYGB7cn0KCgpLQ0xfaHVtYW5bICAsIGRpZmY6PSJOQSJdCktDTF9odW1hblsgKERlbHRhUHNpPD0tMC4xICYgUHJvYmFiaWxpdHk+PTAuOSkgLCBkaWZmOj0iSW4iXQpLQ0xfaHVtYW5bIChEZWx0YVBzaT4wLjEgJiBQcm9iYWJpbGl0eT49MC45KSAsIGRpZmY6PSJFeCJdCgpLQ0xfaHVtYW5fc3RhdHMgPC0gbWVyZ2UoS0NMX2h1bWFuWyAgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgLihXT19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwgCktDTF9odW1hblsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF9odW1hbl9zdGF0cyA8LSBtZXJnZShLQ0xfaHVtYW5fc3RhdHNbZGlmZiE9Ik5BIl0sICBLQ0xfaHVtYW5fc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF9odW1hbl9zdGF0c1ssIGA6PWAoV09fRzRfZnJhcT1XT19HNC9XT19HNF9OQSwgV19HNF9mcmFxPVdfRzQvV19HNF9OQSldCgpLQ0xfaHVtYW5fc3RhdHNbICwgT1IgOj0gV19HNF9mcmFxL1dPX0c0X2ZyYXFdCgoKCgpnZ3Bsb3QoS0NMX2h1bWFuX3N0YXRzKSArCiAgIGdlb21fdGlsZSggYWVzKFR5cGUsIGRpZmYsIGZpbGwgPSBsb2cyKE9SKSkpICsKICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDAsIGxpbWl0cyA9IGMoLTEuNiwgMS42KSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICtsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkKYGBgCgoKV2UgdXNlIGNoaS1zcXVhcmVkIHRlc3QgdG8gY2FsY3VsYXRlIHRoZSBzaWduaWZpY2FuY2UKCgpgYGB7cn0KCgpLQ0xfaHVtYW5fc3RhdHMuY2hpIDwtIGRhdGEudGFibGUoKQoKZm9yICggaSBpbiB1bmlxdWUoS0NMX2h1bWFuX3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzQsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX2h1bWFuX3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0KSkKbWF0cml4LmV4X3JlcyA8LSBjaGlzcS50ZXN0KG1hdHJpeC5leCkKCm1hdHJpeC5pbiA8LSAgbWF0cml4KG5yb3c9MiwgYyhLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0X05BLCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfaHVtYW5fc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzRfTkEsIEtDTF9odW1hbl9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNCkpCm1hdHJpeC5pbl9yZXMgPC0gY2hpc3EudGVzdChtYXRyaXguaW4pCgoKCktDTF9odW1hbl9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX2h1bWFuX3N0YXRzLmNoaSwgY2JpbmQoaSwgIkV4IiwgbWF0cml4LmV4X3JlcyRwLnZhbHVlKSkgCktDTF9odW1hbl9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX2h1bWFuX3N0YXRzLmNoaSwgY2JpbmQoaSwgIkluIiwgbWF0cml4LmluX3JlcyRwLnZhbHVlKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0KCmNvbG5hbWVzKEtDTF9odW1hbl9zdGF0cy5jaGkpIDwtIGMoIlR5cGUiLCAiZGlmZiIsICJQX3ZhbHVlIikKCm50ZXN0ID0gbnJvdyhLQ0xfaHVtYW5fc3RhdHMuY2hpKQoKS0NMX2h1bWFuX3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgpLQ0xfaHVtYW5fc3RhdHMgPC0gbWVyZ2UoS0NMX2h1bWFuX3N0YXRzLCBLQ0xfaHVtYW5fc3RhdHMuY2hpLCBieT1jKCJUeXBlIiwgImRpZmYiKSkKCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTIuMiwgZmlnLndpZHRoPTV9CgoKbGlicmFyeShwbHlyKQoKCmdncGxvdChLQ0xfaHVtYW5fc3RhdHMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKCgoKYGBgCgoKCmBgYHtyfQoKc3BsaWNlX25vZGVfZG90X3Bsb3QgPC0gZnVuY3Rpb24odXBzdHJlYW0ucGF0aCwgZG93bnN0cmVhbS5wYXRoICkgewoKS0NMX3hfdXBzdHJlYW0gPC0gZnJlYWQodXBzdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF91cHN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtPC0gZnJlYWQoZG93bnN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X2Rvd25zdHJlYW0pIDwtYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIgICkKCgpLQ0xfeCA8LSAgbWVyZ2UoS0NMX3hfdXBzdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwKICAgICAgICAgICAgICAgICAgICBLQ0xfeF9kb3duc3RyZWFtWywgYygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJHNCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbKEc0Lng+MCB8IEc0Lnk+MCApLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCktDTF94WyhHNC54PT0wICYgRzQueT09MCApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeFsgIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIC4oV09fRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sIApLQ0xfeFsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzW2RpZmYhPSJOQSJdLCAgS0NMX3hfc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF94X3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF94X3N0YXRzWyAsIE9SIDo9IFdfRzRfZnJhcS9XT19HNF9mcmFxXQoKCktDTF94X3N0YXRzLmNoaSA8LSBkYXRhLnRhYmxlKCkKCmZvciAoIGkgaW4gdW5pcXVlKEtDTF94X3N0YXRzW1R5cGUhPSJBTCJdJFR5cGUpKXsKICAKbWF0cml4LmV4IDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzQpKQptYXRyaXguZXhfcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmV4KQoKbWF0cml4LmluIDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzQpKQptYXRyaXguaW5fcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmluKQoKCgpLQ0xfeF9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX3hfc3RhdHMuY2hpLCBjYmluZChpLCAiRXgiLCBtYXRyaXguZXhfcmVzJHAudmFsdWUpKSAKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIkluIiwgbWF0cml4LmluX3JlcyRwLnZhbHVlKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0KCmNvbG5hbWVzKEtDTF94X3N0YXRzLmNoaSkgPC0gYygiVHlwZSIsICJkaWZmIiwgIlBfdmFsdWUiKQoKbnRlc3QgPSBucm93KEtDTF94X3N0YXRzLmNoaSkKCktDTF94X3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeF9zdGF0cywgS0NMX3hfc3RhdHMuY2hpLCBieT1jKCJUeXBlIiwgImRpZmYiKSkKCmdncGxvdChLQ0xfeF9zdGF0cykgKwogIGdlb21fcG9pbnQoYWVzKFR5cGUsIGRpZmYsIHNpemUgPSAtbG9nKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKCgpyZXR1cm4oS0NMX3hfc3RhdHMpCgoKfQoKYGBgCgoKCgoKCgpgYGB7cn0KCnVwc3RyZWFtLnBhdGggPSAiLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYudXBzdHJlYW1fMTAwbnQuRzRzIiAKZG93bnN0cmVhbS5wYXRoID0gIi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAKCnNwbGljZV9ub2RlX2RvdF9wbG90MiA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGggKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC1jKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IiAgKQoKCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiRzQiKSBdLAogICAgICAgICAgICAgICAgICAgIEtDTF94X2Rvd25zdHJlYW1bLCBjKCJjaHJvbSIsICAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiVHlwZSIgLCAgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkc0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YygiY2hyb20iLCAgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAgIlR5cGUiICwgICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIpICkKCgojS0NMX3ggPC0gIEtDTF94W2VuZC1zdGFydD4zMCB8fCBUeXBlIT0iQ0UiLCBdCgpLQ0xfeFsoRzQueD4wIHwgRzQueT4wICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKEc0Lng9PTAgJiBHNC55PT0wICksIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KS0NMX3gkRzRfYm9sIDwtIGZhY3RvcihLQ0xfeCRHNF9ib2wsIGxldmVscz1jKCJXaXRob3V0IEctcXVhZHJ1cGxleCIsICJXaXRoIEctcXVhZHJ1cGxleCIpICkKCgpLQ0xfeFsgICwgZGlmZjo9Ik5BIl0KS0NMX3hbIChEZWx0YVBzaTw9LTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJJbiJdCktDTF94WyAoRGVsdGFQc2k+MC4xICYgUHJvYmFiaWxpdHk+PTAuOTApICwgZGlmZjo9IkV4Il0KCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94WyAgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiLCAgLihXT19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwgCktDTF94WyAgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCAgLihXX0c0PS5OKSAsIGJ5PWMoIlR5cGUiLCAiZGlmZiIpICBdLApieT1jKCJUeXBlIiwgImRpZmYiKSkKCgoKS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHNbZGlmZiE9Ik5BIl0sICBLQ0xfeF9zdGF0c1tkaWZmPT0iTkEiICwgLihUeXBlLCAgV09fRzRfTkE9V09fRzQsIFdfRzRfTkE9V19HNCkgXSwgYnk9IlR5cGUiKQoKS0NMX3hfc3RhdHNbLCBgOj1gKFdPX0c0X2ZyYXE9V09fRzQvV09fRzRfTkEsIFdfRzRfZnJhcT1XX0c0L1dfRzRfTkEpXQoKS0NMX3hfc3RhdHNbICwgT1IgOj0gV19HNF9mcmFxL1dPX0c0X2ZyYXFdCgoKS0NMX3hfc3RhdHMuY2hpIDwtIGRhdGEudGFibGUoKQoKZm9yICggaSBpbiB1bmlxdWUoS0NMX3hfc3RhdHNbVHlwZSE9IkFMIl0kVHlwZSkpewogIAptYXRyaXggPC0gIG1hdHJpeChucm93PTIsIGMoS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzQsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV19HNCkpCm1hdHJpeC5yZXMgPC0gY2hpc3EudGVzdChtYXRyaXgpCgoKCgoKS0NMX3hfc3RhdHMuY2hpIDwtIHJiaW5kKEtDTF94X3N0YXRzLmNoaSwgY2JpbmQoaSwgIG1hdHJpeC5yZXMkcC52YWx1ZSkpIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQoKY29sbmFtZXMoS0NMX3hfc3RhdHMuY2hpKSA8LSBjKCJUeXBlIiwgIlBfdmFsdWUiKQoKbnRlc3QgPSBucm93KEtDTF94X3N0YXRzLmNoaSkKCktDTF94X3N0YXRzLmNoaVsgLCBgOj1gKFBfdmFsdWUuQm9uZmVycm9uaT1hcy5udW1lcmljKFBfdmFsdWUpKm50ZXN0KSBdCgojS0NMX3hfc3RhdHMgPC0gbWVyZ2UoS0NMX3hfc3RhdHMsIEtDTF94X3N0YXRzLmNoaSwgYnk9YygiVHlwZSIsICJkaWZmIikpCgojZ2dwbG90KEtDTF94X3N0YXRzLmNoaSkgKwojICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZyhQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiMgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKIyAgdGhlbWVfYncoKSArCiMgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKcmV0dXJuKEtDTF94X3N0YXRzLmNoaSkKCgp9CgpgYGAKCgoKCmBgYHtyfQoKZGlmZl9HNF9NRV90YWJsZSA8LSBmdW5jdGlvbih1cHN0cmVhbS5wYXRoLCBkb3duc3RyZWFtLnBhdGgsIGRpc3RfbGltICkgewoKCktDTF94X3Vwc3RyZWFtIDwtIGZyZWFkKHVwc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfdXBzdHJlYW0pIDwtIGMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgpLQ0xfeF91cHN0cmVhbVsgLGRpc3Q6PSgoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikgLXcuc3RhcnQgICkgXQojS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCgpLQ0xfeF9kb3duc3RyZWFtPC0gZnJlYWQoZG93bnN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X2Rvd25zdHJlYW0pIDwtIGMoIncuY2hyb20iLCAidy5zdGFydCIsICJ3LmVuZCIsICJ3LnN0cmFuZCIsICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgoKS0NMX3hfZG93bnN0cmVhbVsgLGRpc3Q6PSgoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIC0gdy5zdGFydCAgIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbICwgRzRfYm9sOj0iV2l0aG91dCBHLXF1YWRydXBsZXgiXQoKS0NMX3hbc3RyYW5kPT0iKyIgJiAoKGRpc3QueCA+PSAtZGlzdF9saW0gJiAgZGlzdC54ICA8PSAwKSB8ICggZGlzdC55ID49MCAmIGRpc3QueTw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbc3RyYW5kPT0iLSIgJiAoKGRpc3QueSA+PSAtZGlzdF9saW0gJiAgZGlzdC55ICA8PSAwKSB8ICggZGlzdC54ID49MCAmIGRpc3QueDw9ZGlzdF9saW0pKSAsIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgoKS0NMX3ggPC0gS0NMX3hbVHlwZT09IkNFIl0KCktDTF94WyAsICBleG9uX2NsYXNzOj0iZXhvbiJdCktDTF94W2VuZC1zdGFydDw9MzAsICBleG9uX2NsYXNzOj0ibWljcm9leG9uIiBdCgpyZXR1cm4oS0NMX3gpCgp9CmBgYAoKCmBgYHtyfQoKYGBgCgoKCmBgYHtyfQp1cHN0cmVhbS5wYXRoID0gIi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHNlcV9LIgpkb3duc3RyZWFtLnBhdGggPSAiLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLmRvd25zdHJlYW0uRzRzZXFfSyIKCkc0X01FX3RhYmxlIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCwgZGlzdF9saW0gKSB7CgoKS0NMX3hfdXBzdHJlYW0gPC0gZnJlYWQodXBzdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF91cHN0cmVhbSkgPC0gYyggImNocm9tIiwgInNzdGFydCIsICJzZW5kIiwgInNzdHJhbmQiLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgpLQ0xfeF91cHN0cmVhbVsgLGRpc3Q6PShzc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KI0tDTF94WyhkaXN0Lng8PWRpc3RfbGltIHwgZGlzdC55PD1kaXN0X2xpbSApLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCgoKS0NMX3hfZG93bnN0cmVhbTwtIGZyZWFkKGRvd25zdHJlYW0ucGF0aCAgKQpjb2xuYW1lcyhLQ0xfeF9kb3duc3RyZWFtKSA8LSBjKCAiY2hyb20iLCAic3N0YXJ0IiwgInNlbmQiLCAic3RyYW5kIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiICApCgoKS0NMX3hfZG93bnN0cmVhbVsgLGRpc3Q6PShzc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoICJjaHJvbSIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgImRpc3QiKSBdLAogICAgICAgICAgICAgICAgICAgIEtDTF94X2Rvd25zdHJlYW1bLCBjKCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJkaXN0IikgXSwgCiAgICAgICAgICAgICAgICAgICAgYnk9YyggImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbICwgRzRfYm9sOj0iV2l0aG91dCBHLXF1YWRydXBsZXgiXQoKS0NMX3hbIHN0cmFuZD09IisiICYgKChkaXN0LnggPj0gLWRpc3RfbGltICYgIGRpc3QueCAgPD0gMCkgfCAoIGRpc3QueSA+PTAgJiBkaXN0Lnk8PWRpc3RfbGltKSkgLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCktDTF94WyBzdHJhbmQ9PSItIiAmICgoZGlzdC55ID49IC1kaXN0X2xpbSAmICBkaXN0LnkgIDw9IDApIHwgKCBkaXN0LnggPj0wICYgZGlzdC54PD1kaXN0X2xpbSkpICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICwgIGV4b25fY2xhc3M6PSJleG9uIl0KS0NMX3hbZW5kLXN0YXJ0PD0zMCwgIGV4b25fY2xhc3M6PSJtaWNyb2V4b24iIF0KCnJldHVybihLQ0xfeCkKCn0KCmBgYAoKCgpgYGB7cn0KCktDTF9odW1hbl9DRSA8LSBLQ0xfaHVtYW5bICwgcGFzdGUoY2hyb20sICAgc3RhcnQsICAgICBlbmQsIHNlcD0iXyIgKSBdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMgPC0gZnJlYWQoIi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHMiKQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyA8LSBmcmVhZCgiLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLmRvd25zdHJlYW0uRzRzIikKCgoKY29sbmFtZXMoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzKSA8LSBjKCAiY2hyb20iLCAic3N0YXJ0IiwgInNlbmQiLCAic3N0cmFuZCIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbICxkaXN0Oj0oIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSAtIHNzdGFydCAgICkgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyAsIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBkaXN0Pj0tMTAwICAmIGRpc3Q8PTAgLCBHNF9ib2w6PSJXaXRoIEctcXVhZHJ1cGxleCJdCgoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyAsIElEOj1wYXN0ZShjaHJvbSwgICBzdGFydCwgICAgIGVuZCwgc2VwPSJfIiApXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWywgZmlsdGVyOj0iT3V0Il0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBJRCAlaW4lICBLQ0xfaHVtYW5fQ0UsIF0KCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cyA8LSBodW1hbi5leG9ucy51cHN0cmVhbS5HNHNbIElEICVpbiUgIEtDTF9odW1hbl9DRSwgXQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLnN0YXRzIDwtaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzWyBleG9uX2xlbjw9MzAwLCAuTiAgLCBieT0gYygiZXhvbl9sZW4iLCAiRzRfYm9sIikgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuc3RhdHNbLCBUb3RhbDo9c3VtKE4pLCBieT1leG9uX2xlbl0KaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLnN0YXRzWywgUGVyY2VudGFnZTo9TioxMDAvVG90YWxdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMkRzRfYm9sIDwtIGZhY3RvcihodW1hbi5leG9ucy51cHN0cmVhbS5HNHMkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSkKCmh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy4zMDAgPC0gaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2V4b25fbGVuPD0zMDBdCgpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwJGJpbiA8LSBjdXQoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2V4b25fbGVuPD0xNTBdJGV4b25fbGVuLCBicmVha3M9NjAsIGxhYmVscz0gc2VxKDUsIDMwMCwgNSksIGluY2x1ZGUubG93ZXN0PVRSVUUgKQoKaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzLjMwMC5zdGF0cyA8LWh1bWFuLmV4b25zLnVwc3RyZWFtLkc0cy4zMDBbIGV4b25fbGVuPD0xNTAsIC5OICAsIGJ5PSBjKCJiaW4iLCAiRzRfYm9sIikgXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzWywgVG90YWw6PXN1bShOKSwgYnk9YmluXQpodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzWywgUGVyY2VudGFnZTo9TioxMDAvVG90YWxdCgpsYWJlbHM9IHNlcSgtOTk1LCAxMDAwLCA1KSwgaW5jbHVkZS5sb3dlc3Q9VFJVRSApCgpnZ3Bsb3QoaHVtYW4uZXhvbnMudXBzdHJlYW0uRzRzW2ZpbHRlcj09IkluIl0pICsKICBnZW9tX2JhcihhZXMoeD1leG9uX2xlbiwgZmlsbD1HNF9ib2wpLCBwb3NpdGlvbiA9ICJmaWxsIiApICsKICB4bGltKGMoMSwgMTUwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJyZWQiKSArCiAgeWxpbShjKDAsIDAuMSkpCgoKCmdncGxvdChodW1hbi5leG9ucy51cHN0cmVhbS5HNHMuMzAwLnN0YXRzW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICsKICBnZW9tX2JhcihhZXMoeD1iaW4sIHk9UGVyY2VudGFnZSksIHN0YXQgPSAiaWRlbnRpdHkiICkgCgoKYGBgCgoKCmBgYHtyfQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyA8LSBmcmVhZCgiLi9FeG9uc19HNHMvaHVtYW4uZXhvbnMudHZzLmRvd25zdHJlYW0uRzRzZXFfUERTIikKCmNvbG5hbWVzKGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzKSA8LSBjKCAiY2hyb20iLCAic3N0YXJ0IiwgInNlbmQiLCAic3N0cmFuZCIsICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgLGRpc3Q6PSggKGdzdGFydCArIChnZW5kLSBnc3RhcnQpLzIpIC0gc3N0YXJ0KSBdCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBzc3RyYW5kPT0iLSIsIGRpc3Q6PSggICBzc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWywgZXhvbl9sZW46PWVuZC1zdGFydF0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyAsIEc0X2JvbDo9IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGRpc3Q8PTEwMCAgJiBkaXN0Pj0wICwgRzRfYm9sOj0iV2l0aCBHLXF1YWRydXBsZXgiXQoKCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWywgZXhvbl9jbGFzczo9ImV4b24iXQpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9sZW48PTMwLCBleG9uX2NsYXNzOj0ibWljcm9leG9uIl0KCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cy4yeDIgPC0gbWF0cml4KG5jb2wgPSAyLApjKG5yb3coaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKCmNoaXNxLnRlc3QoaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHMuMngyKQoKCgoKCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0c1sgLCBJRDo9cGFzdGUoY2hyb20sICAgc3RhcnQsICAgICBlbmQsIHNlcD0iXyIgKV0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWywgZmlsdGVyOj0iT3V0Il0KaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIElEICVpbiUgIEtDTF9odW1hbl9DRSwgIGZpbHRlcjo9IkluIl0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzIDwtIGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzWyBJRCAlaW4lICBLQ0xfaHVtYW5fQ0UsIF0KCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLnN0YXRzIDwtaHVtYW4uZXhvbnMuZG93bnN0cmVhbS5HNHNbIGV4b25fbGVuPD0zMDAsIC5OICAsIGJ5PSBjKCJleG9uX2xlbiIsICJHNF9ib2wiKSBdCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLnN0YXRzWywgVG90YWw6PXN1bShOKSwgYnk9ZXhvbl9sZW5dCmh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLnN0YXRzWywgUGVyY2VudGFnZTo9TioxMDAvVG90YWxdCgpodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cyRHNF9ib2wgPC0gZmFjdG9yKGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzJEc0X2JvbCwgbGV2ZWxzPWMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikpCgoKCmdncGxvdChodW1hbi5leG9ucy5kb3duc3RyZWFtLkc0cykgKwogIGdlb21fYmFyKGFlcyh4PWV4b25fbGVuLCBmaWxsPUc0X2JvbCksIHBvc2l0aW9uID0gImZpbGwiICkgKwogIHhsaW0oYygxLCAzMDApKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMzAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvdXI9InJlZCIpICsKICB5bGltKGMoMCwgMC4xKSkKCgoKZ2dwbG90KGh1bWFuLmV4b25zLmRvd25zdHJlYW0uRzRzLnN0YXRzW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICsKICBnZW9tX2JhcihhZXMoeD1leG9uX2xlbiwgeT1QZXJjZW50YWdlKSwgc3RhdCA9ICJpZGVudGl0eSIgKSArCiAgeGxpbShjKDEsIDMwMCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAzMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0icmVkIikgCgpgYGAKCgoKYGBge3J9CmdncGxvdChodW1hbi5leG9ucy51cHN0cmVhbS5HNHMpICsKICBnZW9tX2JhcihhZXMoeD1leG9uX2xlbiwgZmlsbD1HNF9ib2wpLCBwb3NpdGlvbiA9ICJmaWxsIiApICsKICB4bGltKGMoMSwgMTUwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMwKSArCiAgeWxpbShjKDAuOCwgMSkpCmBgYAoKYGBge3J9CgpnZ3Bsb3QoaGcxOV9NRV90YWJsZV9HNHMpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhHNF9ib2wsIGV4b25fbGVuKSkgKwogIHlsaW0oYygwLCAzMDApKQoKCmhnMTlfTUVfdGFibGVfS1ssIGV4b25fbGVuOj1lbmQtc3RhcnRdCgpnZ3Bsb3QoaGcxOV9NRV90YWJsZV9LKSArIAogIGdlb21fYm94cGxvdChhZXMoRzRfYm9sLCBleG9uX2xlbikpICsKICB5bGltKGMoMCwgMzAwKSkKCmhnMTlfTUVfdGFibGVfRzRzWywgbWVkaWFuKGV4b25fbGVuKSwgYnk9RzRfYm9sXQpoZzE5X01FX3RhYmxlX0tbLCBtZWRpYW4oZXhvbl9sZW4pLCBieT1HNF9ib2xdCgpnZ3Bsb3QoaGcxOV9NRV90YWJsZV9QRFMpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyhHNF9ib2wsIGV4b25fbGVuKSkgKwogIHlsaW0oYygwLCAzMDApKQoKYGBgCgpgYGB7cn0KbWF0cml4KG5jb2w9MiwgYyggKSkKCmBgYAoKCgpgYGB7cn0KCmh1bWFuLk1FX2c0LnN0YXRzIDwtIGRhdGEudGFibGUoKQoKaGcxOV9NRV90YWJsZV9HNHMgPC0gRzRfTUVfdGFibGUoIi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHMiICwgIi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy5kb3duc3RyZWFtLkc0cyIsIDEwMCApCgoKCmhnMTlfTUVfdGFibGVfRzRzLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhoZzE5X01FX3RhYmxlX0c0c1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9HNHNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfRzRzWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpoZzE5X01FX3RhYmxlX0c0c1sgLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKCmNvbG5hbWVzKGhnMTlfTUVfdGFibGVfRzRzLjJ4MikgPC0gYygiZXhvbiIsICJtaWNyb2V4b24iKQpyb3duYW1lcyhoZzE5X01FX3RhYmxlX0c0cy4yeDIpIDwtIGMoIldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIldpdGggRy1xdWFkcnVwbGV4IikKCgpodW1hbi5NRV9nNC5zdGF0cyA8LSByYmluZChodW1hbi5NRV9nNC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdGlmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX0c0cy4yeDIpJHAudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhnMTlfTUVfdGFibGVfRzRzLjJ4MlsgMiAsIDIgXS9oZzE5X01FX3RhYmxlX0c0cy4yeDJbIDEgLCAyIF0pIC8gKGhnMTlfTUVfdGFibGVfRzRzLjJ4MlsgMiAsIDEgXS9oZzE5X01FX3RhYmxlX0c0cy4yeDJbIDEgLCAxIF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKCgpoZzE5X01FX3RhYmxlX0sgPC0gRzRfTUVfdGFibGUoIi4vRXhvbnNfRzRzL2h1bWFuLmV4b25zLnR2cy51cHN0cmVhbS5HNHNlcV9LIiAsICIuL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgoKaGcxOV9NRV90YWJsZV9LLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhoZzE5X01FX3RhYmxlX0tbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfS1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9LWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfS1sgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggaGcxOV9NRV90YWJsZV9LLjJ4MikKCgpodW1hbi5NRV9nNC5zdGF0cyA8LSByYmluZChodW1hbi5NRV9nNC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIksrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX0suMngyKSRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZzE5X01FX3RhYmxlX0suMngyWyAyICwgMiBdL2hnMTlfTUVfdGFibGVfSy4yeDJbIDEgLCAyIF0pIC8gKGhnMTlfTUVfdGFibGVfSy4yeDJbIDIgLCAxIF0vaGcxOV9NRV90YWJsZV9LLjJ4MlsgMSAsIDEgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQoKCmhnMTlfTUVfdGFibGVfUERTIDwtIEc0X01FX3RhYmxlKCIuL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuL0V4b25zX0c0cy9odW1hbi5leG9ucy50dnMuZG93bnN0cmVhbS5HNHNlcV9QRFMiLCAxMDAgKQoKCmhnMTlfTUVfdGFibGVfUERTLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhoZzE5X01FX3RhYmxlX1BEU1sgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coaGcxOV9NRV90YWJsZV9QRFNbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfUERTWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KGhnMTlfTUVfdGFibGVfUERTWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBoZzE5X01FX3RhYmxlX1BEUy4yeDIpCgpodW1hbi5NRV9nNC5zdGF0cyA8LSByYmluZChodW1hbi5NRV9nNC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpc3EudGVzdCggaGcxOV9NRV90YWJsZV9QRFMuMngyKSRwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZzE5X01FX3RhYmxlX1BEUy4yeDJbIDIgLCAyIF0vaGcxOV9NRV90YWJsZV9QRFMuMngyWyAxICwgMiBdKSAvIChoZzE5X01FX3RhYmxlX1BEUy4yeDJbIDIgLCAxIF0vaGcxOV9NRV90YWJsZV9QRFMuMngyWyAxICwgMSBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCgpgYGAKCgpgYGB7cn0KY29sbmFtZXMoaHVtYW4uTUVfZzQuc3RhdHMpIDwtIGMoIkc0X3NpZ25hbCIsICJwLnZhbHVlIiwgIk9SIikgCgpodW1hbi5NRV9nNC5zdGF0c1ssIFBfdmFsdWUuQm9uZmVycm9uaTo9YXMubnVtZXJpYyhwLnZhbHVlKSozXQoKCmdncGxvdChodW1hbi5NRV9nNC5zdGF0cykgKwogIGdlb21fcG9pbnQoYWVzKEc0X3NpZ25hbCwgbG9nMihhcy5udW1lcmljKE9SKSksIHNpemUgPSAtbG9nMTAoUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWVfYncoKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAKYGBgCgoKCgoKYGBge3J9CgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siICwgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsIDEwMCApCgoKCnRvdGFsX21vdXNlX0tfTUVfdGFibGUgPC0gdW5pcXVlKHJiaW5kKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfS19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9LX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSkpCgoKdG90YWxfbW91c2VfS19NRV90YWJsZS4yeDIgPC0gbWF0cml4KG5jb2wgPSAyLApjKG5yb3codG90YWxfbW91c2VfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyh0b3RhbF9tb3VzZV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCB0b3RhbF9tb3VzZV9LX01FX3RhYmxlLjJ4MikKCgpjb2xuYW1lcyh0b3RhbF9tb3VzZV9LX01FX3RhYmxlLjJ4MikgPC0gYygiZXhvbiIsICJtaWNyb2V4b24iKQpyb3duYW1lcyh0b3RhbF9tb3VzZV9LX01FX3RhYmxlLjJ4MikgPC0gYygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiICwgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9QRFNfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9QRFNfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlIDwtIHVuaXF1ZShyYmluZChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVsgLCBjKCJjaHJvbSIgLCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIlR5cGUiLCAiRzRfYm9sIiwgImV4b25fY2xhc3MiKV0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9QRFNfTUVfdGFibGVbICwgYygiY2hyb20iICwic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIkc0X2JvbCIsICJleG9uX2NsYXNzIildLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfUERTX01FX3RhYmxlWyAsIGMoImNocm9tIiAsInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJHNF9ib2wiLCAiZXhvbl9jbGFzcyIpXSkpCgoKdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyh0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3codG90YWxfbW91c2VfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHRvdGFsX21vdXNlX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggdG90YWxfbW91c2VfUERTX01FX3RhYmxlLjJ4MikKYGBgCgoKYGBge3J9CgpLQ0xfaHVtYW5bLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX21vdGlmX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiICwgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfbW90aWZfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYudXBzdHJlYW0uRzRzLmZpeCIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzLmZpeCIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsIDEwMCApCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWZfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfbW90aWZfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9tb3RpZl9NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfS19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDFfS19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX0tfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX1BEU19NRV90YWJsZVssIElEOj1wYXN0ZSggY2hyb20sIHN0cmFuZCwgc3RhcnQsIGVuZCAgLCBzZXA9Il8iKV0KCgpBbGxfbW91c2UgPC0gZGF0YS50YWJsZSh1bmlxdWUoYyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9LX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfS19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfbW90aWZfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCkVTQ19kZXJpdmVkX25ldXJvbl9DRDFfbW90aWZfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX21vdGlmX01FX3RhYmxlW0c0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSURdKSkpCgoKY29sbmFtZXMoQWxsX21vdXNlKSA8LSAiSUQiCgoKCgoKQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX21vdGlmOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9tb3RpZl9NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX21vdGlmOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX21vdGlmX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9tb3RpZjo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9tb3RpZl9NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzFfbW90aWY6PVRSVUUgICBdCgpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMV9LX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIEVTQ19kZXJpdmVkX25ldXJvbl9DRDFfSzo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9LX01FX3RhYmxlW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEIF0sIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9LOj1UUlVFICAgXQpBbGxfbW91c2VbIElEICVpbiUgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX0tfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX0s6PVRSVUUgICBdCgoKQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFM6PVRSVUUgICBdCkFsbF9tb3VzZVsgSUQgJWluJSBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEU19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBFU0NfZGVyaXZlZF9uZXVyb25fQ0QxX1BEUzo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMV9QRFNfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxX1BEUzo9VFJVRSAgIF0KQWxsX21vdXNlWyBJRCAlaW4lIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMV9QRFNfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxX1BEUzo9VFJVRSAgIF0KCgpBbGxfbW91c2UgPC0gY2JpbmQoQWxsX21vdXNlLCByb3dTdW1zKGlzLm5hKEFsbF9tb3VzZSkpKQoKCmZ3cml0ZShBbGxfbW91c2Vbb3JkZXIoVjIpXSwgIi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL1RvdGFsX21vdXNlLnR4dCIsIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgogICAgICAgCgogICAgICAgCgpodW1hbl9tb3RpZl9NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHMiICwgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW0uRzRzIiwgMTAwICkgICAKaHVtYW5fS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQpodW1hbl9QRFNfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsIDEwMCApICAgCiAgICAgCmh1bWFuX21vdGlmX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9LX01FX3RhYmxlWywgSUQ6PXBhc3RlKCBjaHJvbSwgc3RyYW5kLCBzdGFydCwgZW5kICAsIHNlcD0iXyIpXQpodW1hbl9QRFNfTUVfdGFibGVbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgpBbGxfaHVtYW48LSBkYXRhLnRhYmxlKHVuaXF1ZShjKCAgICAgICAgIApodW1hbl9tb3RpZl9NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSwgICAgICAgCmh1bWFuX0tfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRF0sCmh1bWFuX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCIsIElEXSkpKQoKY29sbmFtZXMoQWxsX2h1bWFuKSA8LSAiSUQiCgoKCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9tb3RpZl9NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX21vdGlmOj1UUlVFICAgXQpBbGxfaHVtYW5bIElEICVpbiUgaHVtYW5fS19NRV90YWJsZVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBJRCBdLCBkaWZmX0s6PVRSVUUgICBdCkFsbF9odW1hblsgSUQgJWluJSBodW1hbl9QRFNfTUVfdGFibGVbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgSUQgXSwgZGlmZl86PVRSVUUgICBdCgoKCkFsbF9odW1hbiA8LSBjYmluZChBbGxfaHVtYW4sIHJvd1N1bXMoaXMubmEoQWxsX2h1bWFuKSkpCgoKZndyaXRlKEFsbF9odW1hbltvcmRlcihWMildLCAiLi9wb3Rhc3NpdW1fZXhwZXJpbWVudHMvVG90YWxfaHVtYW4udHh0IiwgIG5hPSJGQUxTRSIsIHNlcCA9ICJcdCIsIHF1b3RlPUYpCgoKCgoKYGBgCgoKCgpgYGB7cn0KaHVtYW5fbW91c2UgPC0gZnJlYWQoIi4vcG90YXNzaXVtX2V4cGVyaW1lbnRzL2h1bWFuX21vdXNlLjAuMi5leG9ucyIpCgpjb2xuYW1lcyhodW1hbl9tb3VzZSkgPC0gYygiaElEIiwgIm1JRCIsICJzY29yZV9pbmRleCIpCgoKQWxsX2h1bWFuLm1vdXNlIDwtIG1lcmdlKEFsbF9odW1hbiwgaHVtYW5fbW91c2UsIGJ5Lng9IklEIiwgYnkueT0iaElEIikKCgpBbGxfaHVtYW4ubW91c2UgPC0gbWVyZ2UoQWxsX2h1bWFuLm1vdXNlLCBBbGxfbW91c2UsIGJ5LnggPSAibUlEIiwgYnkueT0iSUQiKQoKCgoKCkFsbF9odW1hbi5tb3VzZS5kaWZmIDwtICBBbGxfaHVtYW4ubW91c2VbVjIueTwxMiAmIFYyLng8MyBdCgoKQWxsX2h1bWFuLm1vdXNlLmRpZmYKCgoKCgpLQ0xfaHVtYW5fQ0VbLCBJRDo9cGFzdGUoIGNocm9tLCBzdHJhbmQsIHN0YXJ0LCBlbmQgICwgc2VwPSJfIildCgoKQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZSA8LSBtZXJnZShBbGxfaHVtYW4ubW91c2UuZGlmZiwgS0NMX2h1bWFuX0NFLCBieT0iSUQiKQoKClZpZXcoQWxsX2h1bWFuLm1vdXNlLmRpZmYuZ2VuZVtvcmRlcihWMi55LCBWMi54ICApXVssIGMoIklEIiwgIm1JRCIsICJWMi54IiwgIlYyLnkiLCAid2lraWdlbmVfZGVzY3JpcHRpb24iLCAiaGduY19zeW1ib2wiKV0gKQoKCmNhdChBbGxfaHVtYW4ubW91c2UuZGlmZi5nZW5lWywgaGduY19zeW1ib2xdLCBzZXA9IlxuIikKCmZ3cml0ZShBbGxfaHVtYW4ubW91c2UuZGlmZi5nZW5lW29yZGVyKFYyLnksIFYyLnggICldWywgYygiSUQiLCAiVjIueCIsICJWMi55IiwgIndpa2lnZW5lX2Rlc2NyaXB0aW9uIiwgImhnbmNfc3ltYm9sIildLCAiLi9wb3Rhc3NpdW1fZXhwZXJpbWVudHMvaHVtYW4ubW91c2UuZGlmZi5HNC5nZW5lLnR4dCIsICBuYT0iRkFMU0UiLCBzZXAgPSAiXHQiLCBxdW90ZT1GKQoKYGBgCgpgYGB7cn0KS0NMX2h1bWFuW0lEPSIiXQpgYGAKCgoKYGBge3J9Cgp0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiLCBtZWFuKGV4b25fbGVuKSBdCnRvdGFsX21vdXNlX1BEU19NRV90YWJsZVtHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCIsICBtZWFuKGV4b25fbGVuKSBdCgp0b3RhbF9tb3VzZV9QRFNfTUVfdGFibGVbLCBleG9uX2xlbjo9ZW5kLXN0YXJ0XQoKd2lsY294LnRlc3QoICBleG9uX2xlbiB+IEc0X2JvbCwgZGF0YT10b3RhbF9tb3VzZV9QRFNfTUVfdGFibGUgKQoKCgpgYGAKCgoKYGBge3J9CnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUgPC0gZGlmZl9HNF9NRV90YWJsZSgiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9LX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSkgKSkKCmNoaXNxLnRlc3QoIHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX0tfTUVfdGFibGUuMngyKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiICwgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwgMTAwICkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlLjJ4MiA8LSBtYXRyaXgobmNvbCA9IDIsCmMobnJvdyhwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMV9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aCBHLXF1YWRydXBsZXgiXSksCm5yb3cocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDFfUERTX01FX3RhYmxlLjJ4MikKCgoKQ29udHJvbF92c19LQ0xfS19NRV90YWJsZSA8LSBkaWZmX0c0X01FX3RhYmxlKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiAsICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLCAxMDAgKQoKCkNvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4Il0pLApucm93KENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJleG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pLApucm93KENvbnRyb2xfdnNfS0NMX0tfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfS19NRV90YWJsZVsgZXhvbl9jbGFzcz09Im1pY3JvZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSApKQoKY2hpc3EudGVzdCggQ29udHJvbF92c19LQ0xfS19NRV90YWJsZS4yeDIpCgoKQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlIDwtIGRpZmZfRzRfTUVfdGFibGUoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIgLCAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwgMTAwICkKCgpDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyIDwtIG1hdHJpeChuY29sID0gMiwKYyhucm93KENvbnRyb2xfdnNfS0NMX1BEU19NRV90YWJsZVsgZXhvbl9jbGFzcz09ImV4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0iZXhvbiIgJiBHNF9ib2w9PSJXaXRoIEctcXVhZHJ1cGxleCJdKSwKbnJvdyhDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGVbIGV4b25fY2xhc3M9PSJtaWNyb2V4b24iICYgRzRfYm9sPT0iV2l0aG91dCBHLXF1YWRydXBsZXgiXSksCm5yb3coQ29udHJvbF92c19LQ0xfUERTX01FX3RhYmxlWyBleG9uX2NsYXNzPT0ibWljcm9leG9uIiAmIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4Il0pICkpCgpjaGlzcS50ZXN0KCBDb250cm9sX3ZzX0tDTF9QRFNfTUVfdGFibGUuMngyKQpgYGAKCgoKCgpgYGB7cn0KCiN1cHN0cmVhbS5wYXRoID0gIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siIAojZG93bnN0cmVhbS5wYXRoID0gIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIgCgojZGlzdF9saW0gPSAxNTAKCgp1cHN0cmVhbS5wYXRoID0gIi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIgpkb3duc3RyZWFtLnBhdGggPSAiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi51cHN0cmVhbS5HNHNlcV9LIgpkaXN0X2xpbSA9IDEwMAoKc3BsaWNlX25vZGVfZG90X3Bsb3QzIDwtIGZ1bmN0aW9uKHVwc3RyZWFtLnBhdGgsIGRvd25zdHJlYW0ucGF0aCwgZGlzdF9saW0gKSB7CgpLQ0xfeF91cHN0cmVhbSA8LSBmcmVhZCh1cHN0cmVhbS5wYXRoICApCmNvbG5hbWVzKEtDTF94X3Vwc3RyZWFtKSA8LSBjKCJ3LmNocm9tIiwgIncuc3RhcnQiLCAidy5lbmQiLCAidy5zdHJhbmQiLCAiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IiAgKQoKS0NMX3hfdXBzdHJlYW1bICxkaXN0Oj1hYnMody5zdGFydCAtIChnc3RhcnQgKyAoZ2VuZC0gZ3N0YXJ0KS8yKSkgXQoKCktDTF94X2Rvd25zdHJlYW08LSBmcmVhZChkb3duc3RyZWFtLnBhdGggICkKY29sbmFtZXMoS0NMX3hfZG93bnN0cmVhbSkgPC0gYygidy5jaHJvbSIsICJ3LnN0YXJ0IiwgIncuZW5kIiwgIncuc3RyYW5kIiwgImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiVHlwZSIsICJQc2lfQSIsICJQc2lfQiIsICJEZWx0YVBzaSIsICJQcm9iYWJpbGl0eSIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZ3Njb3JlIiwgImV4b25fZGlzdCIgICkKCgpLQ0xfeF9kb3duc3RyZWFtWyAsZGlzdDo9YWJzKHcuc3RhcnQgLSAoZ3N0YXJ0ICsgKGdlbmQtIGdzdGFydCkvMikpIF0KCktDTF94IDwtICBtZXJnZShLQ0xfeF91cHN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sCiAgICAgICAgICAgICAgICAgICAgS0NMX3hfZG93bnN0cmVhbVssIGMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiZGlzdCIpIF0sIAogICAgICAgICAgICAgICAgICAgIGJ5PWMoImNocm9tIiwgICJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgICJUeXBlIiAsICAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiKSApCgoKI0tDTF94IDwtICBLQ0xfeFtlbmQtc3RhcnQ+MzAgfHwgVHlwZSE9IkNFIiwgXQoKS0NMX3hbKGRpc3QueDw9ZGlzdF9saW0gfCBkaXN0Lnk8PWRpc3RfbGltICksIEc0X2JvbDo9IldpdGggRy1xdWFkcnVwbGV4Il0KS0NMX3hbKGRpc3QueD5kaXN0X2xpbSAmIGRpc3QueT5kaXN0X2xpbSApLCBHNF9ib2w6PSJXaXRob3V0IEctcXVhZHJ1cGxleCJdCktDTF94JEc0X2JvbCA8LSBmYWN0b3IoS0NMX3gkRzRfYm9sLCBsZXZlbHM9YygiV2l0aG91dCBHLXF1YWRydXBsZXgiLCAiV2l0aCBHLXF1YWRydXBsZXgiKSApCgoKS0NMX3hbICAsIGRpZmY6PSJOQSJdCktDTF94WyAoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT49MC45MCkgLCBkaWZmOj0iSW4iXQpLQ0xfeFsgKERlbHRhUHNpPjAuMSAmIFByb2JhYmlsaXR5Pj0wLjkwKSAsIGRpZmY6PSJFeCJdCgpLQ0xfeF9zdGF0cyA8LSBtZXJnZShLQ0xfeFsgIEc0X2JvbD09IldpdGhvdXQgRy1xdWFkcnVwbGV4IiwgIC4oV09fRzQ9Lk4pICwgYnk9YygiVHlwZSIsICJkaWZmIikgIF0sIApLQ0xfeFsgIEc0X2JvbD09IldpdGggRy1xdWFkcnVwbGV4IiwgIC4oV19HND0uTikgLCBieT1jKCJUeXBlIiwgImRpZmYiKSAgXSwKYnk9YygiVHlwZSIsICJkaWZmIikpCgoKCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzW2RpZmYhPSJOQSJdLCAgS0NMX3hfc3RhdHNbZGlmZj09Ik5BIiAsIC4oVHlwZSwgIFdPX0c0X05BPVdPX0c0LCBXX0c0X05BPVdfRzQpIF0sIGJ5PSJUeXBlIikKCktDTF94X3N0YXRzWywgYDo9YChXT19HNF9mcmFxPVdPX0c0L1dPX0c0X05BLCBXX0c0X2ZyYXE9V19HNC9XX0c0X05BKV0KCktDTF94X3N0YXRzWyAsIE9SIDo9IFdfRzRfZnJhcS9XT19HNF9mcmFxXQoKCktDTF94X3N0YXRzLmNoaSA8LSBkYXRhLnRhYmxlKCkKCmZvciAoIGkgaW4gdW5pcXVlKEtDTF94X3N0YXRzW1R5cGUhPSJBTCIgJiBUeXBlIT0iQUYiXSRUeXBlKSl7CiAgCm1hdHJpeC5leCA8LSAgbWF0cml4KG5yb3c9MiwgYyhLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkV4Il0kV09fRzRfTkEsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXT19HNCwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJFeCJdJFdfRzRfTkEsIEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iRXgiXSRXX0c0KSkKbWF0cml4LmV4X3JlcyA8LSBjaGlzcS50ZXN0KG1hdHJpeC5leCwgY29ycmVjdD1UUlVFKQoKbWF0cml4LmluIDwtICBtYXRyaXgobnJvdz0yLCBjKEtDTF94X3N0YXRzW1R5cGU9PWkgJiBkaWZmPT0iSW4iXSRXT19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdPX0c0LCBLQ0xfeF9zdGF0c1tUeXBlPT1pICYgZGlmZj09IkluIl0kV19HNF9OQSwgS0NMX3hfc3RhdHNbVHlwZT09aSAmIGRpZmY9PSJJbiJdJFdfRzQpKQptYXRyaXguaW5fcmVzIDwtIGNoaXNxLnRlc3QobWF0cml4LmluLCBjb3JyZWN0PVRSVUUpCgoKCktDTF94X3N0YXRzLmNoaSA8LSByYmluZChLQ0xfeF9zdGF0cy5jaGksIGNiaW5kKGksICJFeCIsIG1hdHJpeC5leF9yZXMkcC52YWx1ZSkpIApLQ0xfeF9zdGF0cy5jaGkgPC0gcmJpbmQoS0NMX3hfc3RhdHMuY2hpLCBjYmluZChpLCAiSW4iLCBtYXRyaXguaW5fcmVzJHAudmFsdWUpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQoKY29sbmFtZXMoS0NMX3hfc3RhdHMuY2hpKSA8LSBjKCJUeXBlIiwgImRpZmYiLCAiUF92YWx1ZSIpCgpudGVzdCA9IG5yb3coS0NMX3hfc3RhdHMuY2hpKQoKS0NMX3hfc3RhdHMuY2hpWyAsIGA6PWAoUF92YWx1ZS5Cb25mZXJyb25pPWFzLm51bWVyaWMoUF92YWx1ZSkqbnRlc3QpIF0KCktDTF94X3N0YXRzIDwtIG1lcmdlKEtDTF94X3N0YXRzLCBLQ0xfeF9zdGF0cy5jaGksIGJ5PWMoIlR5cGUiLCAiZGlmZiIpKQoKZ2dwbG90KEtDTF94X3N0YXRzKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2coUF92YWx1ZS5Cb25mZXJyb25pKSwgc2hhcGU9UF92YWx1ZS5Cb25mZXJyb25pPDAuMDUsIGNvbG91cj1sb2cyKE9SKSApICkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93PSJibHVlIiwgaGlnaD0icmVkIiwgbWlkID0gImdyZXkiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKCnJldHVybihLQ0xfeF9zdGF0cykKCgp9CgpgYGAKCgoKCgoKCgpgYGB7cn0KdGVzdCA8LSBmcmVhZCgiLi9LQ0wvTWljcm9FeG9uYXRvci9Db250cm9sX3ZzX0tDTC5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIpCmBgYAoKIyBBUTEKCmBgYHtyfQoKCgpBUTEuMS5tb3RpZiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi51cHN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkFRMS4xLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkFRMS4xLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vQVExL0NvbnRyb2xfdnNfMW11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCgoKCkFRMS4yLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9BUTEvQ29udHJvbF92c18ybXUuZGlmZi5kb3duc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0FRMS9Db250cm9sX3ZzXzJtdS5kaWZmLnVwc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKQVExLjIuSyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vQVExL0NvbnRyb2xfdnNfMm11LmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vQVExL0NvbnRyb2xfdnNfMm11LmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKQVExLjIuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9BUTEvQ29udHJvbF92c18ybXUuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0FRMS9Db250cm9sX3ZzXzJtdS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKYGBgCgoKCgojIFBEUwoKYGBge3J9CgpIRUsuUERTLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9QRFNfY1BEUy9jbG9zZXN0L0NvbnRyb2xfdnNfUERTX0hFSy5kaWZmLnVwc3RyZWFtLkc0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL1BEU19jUERTL2Nsb3Nlc3QvQ29udHJvbF92c19QRFNfSEVLLmRpZmYuZG93bnN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCkFRMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgpBUTEuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9BUTEvQ29udHJvbF92c18xbXUuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0FRMS9Db250cm9sX3ZzXzFtdS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgpgYGAKCgoKCgoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKaHVtYW4uZG90cGxvdCA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDIoIi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4vS0NML01pY3JvRXhvbmF0b3IvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgoKaHVtYW4ubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9Db250cm9sX3ZzX0tDTC5kaWZmLmRvd25zdHJlYW0uRzRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkKCgoKCmh1bWFuLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKaHVtYW4uUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0NvbnRyb2xfdnNfS0NMLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvQ29udHJvbF92c19LQ0wuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKaHVtYW4ubW90aWZbICwgRzRfc2lnbmFsOj0iTW90aWYiICBdCmh1bWFuLktbICwgRzRfc2lnbmFsOj0iSysiICBdCmh1bWFuLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpodW1hbi5tb3RpZl9LX1BEUyA8LSByYmluZChodW1hbi5tb3RpZiwgaHVtYW4uSywgaHVtYW4uUERTKQoKaHVtYW4ubW90aWZfS19QRFMkRzRfc2lnbmFsIDwtIGZhY3RvcihodW1hbi5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCkZpZzUuQTEgPC0gZ2dwbG90KGh1bWFuLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCmBgYAoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKc3VwcC5kb3RwbG90LkEgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QyKCIuL0tDTC9NaWNyb0V4b25hdG9yL0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4vS0NML01pY3JvRXhvbmF0b3IvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW1fMTAwbnQuRzRzIiAgKQoKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzLmZpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApCgoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgoKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5tb3RpZlsgLCBHNF9zaWduYWw6PSJNb3RpZiIgIF0KRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5LWyAsIEc0X3NpZ25hbDo9IksrIiAgXQpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTIDwtIHJiaW5kKEVTQ19kZXJpdmVkX25ldXJvbl9DRDEubW90aWYsIEVTQ19kZXJpdmVkX25ldXJvbl9DRDEuSywgRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5QRFMpCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCA8LSBmYWN0b3IoRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKYGBgCgoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKc3VwcC5kb3RwbG90LkMgPC0gIHNwbGljZV9ub2RlX2RvdF9wbG90MigiLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYuZG93bnN0cmVhbV8xMDBudC5HNHMiICApCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi51cHN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuS1sgLCBHNF9zaWduYWw6PSJLKyIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWZfS19QRFMgPC0gcmJpbmQocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLm1vdGlmLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuSywgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLlBEUykKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwgPC0gZmFjdG9yKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEubW90aWZfS19QRFMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgZmFjZXRfZ3JpZChHNF9zaWduYWwgfiAuKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgoKYGBgCgoKCgpgYGB7ciwgIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQoKc3VwcC5kb3RwbG90LkQgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QyKCIuL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtXzEwMG50Lkc0cyIsICAiLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLksgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSkKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuUERTIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmLmRvd25zdHJlYW0uRzRzZXFfUERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmWyAsIEc0X3NpZ25hbDo9Ik1vdGlmIiAgXQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuS1sgLCBHNF9zaWduYWw6PSJLKyIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLlBEU1sgLCBHNF9zaWduYWw6PSJQRFMiICBdCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMgPC0gcmJpbmQocHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLm1vdGlmLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuSywgcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLlBEUykKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwgPC0gZmFjdG9yKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwsIGxldmVscyA9IGMoIk1vdGlmIiwgIksrIiwgIlBEUyIpICkKCmdncGxvdChwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEubW90aWZfS19QRFMpICsKICBnZW9tX3BvaW50KGFlcyhUeXBlLCBkaWZmLCBzaXplID0gLWxvZzEwKFBfdmFsdWUuQm9uZmVycm9uaSksIHNoYXBlPVBfdmFsdWUuQm9uZmVycm9uaTwwLjA1LCBjb2xvdXI9bG9nMihPUikgKSApICsKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAwKSArCiAgZmFjZXRfZ3JpZChHNF9zaWduYWwgfiAuKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCgpgYGAKCgoKCmBgYHtyLCAgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9CgpzdXBwLmRvdHBsb3QuQiA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDIoIi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbV8xMDBudC5HNHMiLCAgIi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtXzEwMG50Lkc0cyIgICkKCgoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEubW90aWYgPC0gc3BsaWNlX25vZGVfZG90X3Bsb3QzKCIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi51cHN0cmVhbS5HNHMuZml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuL0tDTC9NaWNyb0V4b25hdG9yL2Nsb3Nlc3QvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZi5kb3duc3RyZWFtLkc0cy5maXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKQoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5LIDwtIHNwbGljZV9ub2RlX2RvdF9wbG90MygiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYudXBzdHJlYW0uRzRzZXFfSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9LIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1KQoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLlBEUyA8LSBzcGxpY2Vfbm9kZV9kb3RfcGxvdDMoIi4vS0NML01pY3JvRXhvbmF0b3IvY2xvc2VzdC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmLnVwc3RyZWFtLkc0c2VxX1BEUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi9LQ0wvTWljcm9FeG9uYXRvci9jbG9zZXN0L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmYuZG93bnN0cmVhbS5HNHNlcV9QRFMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUpCgoKCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZlsgLCBHNF9zaWduYWw6PSJNb3RpZiIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuS1sgLCBHNF9zaWduYWw6PSJLKyIgIF0KcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuUERTWyAsIEc0X3NpZ25hbDo9IlBEUyIgIF0KCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmX0tfUERTIDwtIHJiaW5kKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5LLCBwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5QRFMpCgpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5tb3RpZl9LX1BEUyRHNF9zaWduYWwgPC0gZmFjdG9yKHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmX0tfUERTJEc0X3NpZ25hbCwgbGV2ZWxzID0gYygiTW90aWYiLCAiSysiLCAiUERTIikgKQoKZ2dwbG90KHByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLm1vdGlmX0tfUERTKSArCiAgZ2VvbV9wb2ludChhZXMoVHlwZSwgZGlmZiwgc2l6ZSA9IC1sb2cxMChQX3ZhbHVlLkJvbmZlcnJvbmkpLCBzaGFwZT1QX3ZhbHVlLkJvbmZlcnJvbmk8MC4wNSwgY29sb3VyPWxvZzIoT1IpICkgKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3c9ImJsdWUiLCBoaWdoPSJyZWQiLCBtaWQgPSAiZ3JleSIsIG1pZHBvaW50ID0gMCkgKwogIGZhY2V0X2dyaWQoRzRfc2lnbmFsIH4gLikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKYGBgCgoKCmBgYHtyfQoKCktDTF9odW1hblsoRGVsdGFQc2k8PS0wLjEgJiBQcm9iYWJpbGl0eT4wLjkpLCBEZWx0YV90eXBlOj0iSW5jbHVkZWQiXQpLQ0xfaHVtYW5bKERlbHRhUHNpPj0wLjEgJiBQcm9iYWJpbGl0eT4wLjkpLCBEZWx0YV90eXBlOj0iU2tpcGVkIl0KS0NMX2h1bWFuW2lzLm5hKERlbHRhX3R5cGUpLCBEZWx0YV90eXBlOj0iTm9uZSJdCktDTF9odW1hbl9zdGF0cyA8LSAgS0NMX2h1bWFuW1R5cGU9PSJDRSIgLCAuKGNvdW50PS5OKSwgYnk9YygiRGVsdGFfdHlwZSIsICJleG9uIiwgIkc0X2JvbCIpIF0gCktDTF9odW1hbl9zdGF0c1ssIHRvdGFsOj1zdW0oY291bnQpLCBieT0iRzRfYm9sIl0KS0NMX2h1bWFuX3N0YXRzWywgZnJhY3Rpb246PWNvdW50L3RvdGFsXQoKRmlnNS5CIDwtIGdncGxvdCgpICsKICBnZW9tX2JhcihkYXRhPUtDTF9odW1hbl9zdGF0c1tEZWx0YV90eXBlIT0iTm9uZSIgJiBleG9uPT0iZXhvbiIsIF0gLCBhZXMoeD0gRzRfYm9sLCB5PWZyYWN0aW9uLCBncm91cD1EZWx0YV90eXBlLCBmaWxsPURlbHRhX3R5cGUgKSAsIHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IiAgKSArCiAgeGxhYigiIikgKwogIHlsYWIoIkZyYWN0aW9uIG9mIGRpZmZlcmVudGlhbGx5IGluY2x1ZWQgZXhvbnMgIikgKwogIHRoZW1lX2J3KCkgKwogIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT0iQWx0ZXJuYXRpdmUgc3BsaWNpbmcgZXZlbnQiKSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKRmlnNS5CCgpgYGAKCgoKYGBge3J9CgoKZGlmZi51cCA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iKQpkaWZmLmRvd24gPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iKQplcWwudXAgPC0gcmVhZF9kaXN0X3RhYmxlKCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iKQplcWwuZG93biA8LSByZWFkX2Rpc3RfdGFibGUoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnNjb3JlLkFsbF9HNC50c3YuY2xlYW4udHh0Li5iZWQubGlzdC5vdXQubnVtIikKCgpkaWZmLnVwWywgYDo9YCh0eXBlPSJkaWZmIiwgcG9zPSJ1cCIgKV0KZGlmZi5kb3duWywgYDo9YCh0eXBlPSJkaWZmIiwgcG9zPSJkb3duIiApXQplcWwudXBbLCBgOj1gKHR5cGU9ImVxbCIsIHBvcz0idXAiICldCmVxbC5kb3duWywgYDo9YCh0eXBlPSJlcWwiLCBwb3M9ImRvd24iICldCgoKZGlmZl9lcWwgPC0gIHJiaW5kKGRpZmYudXAsICBkaWZmLmRvd24sIGVxbC51cCwgZXFsLmRvd24pCgoKZ2dwbG90KGRpZmZfZXFsKSArCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLCB5PUVucnJpY2htZW50LCBncm91cD10eXBlKSkgKwogIGZhY2V0X2dyaWQocG9zIH4gLikgKwogIHRoZW1lX2J3KCkgCgpgYGAKCgoKCmBgYHtyfQoKcGxvdF9lcWxfZGlmZiA8LSBmdW5jdGlvbihlcWxfdXBfcGx1cywgZXFsX3VwX21pbnVzLCBlcWxfZG93bl9wbHVzLCBlcWxfZG93bl9taW51cywgZGlmZl91cF9wbHVzLCBkaWZmX3VwX21pbnVzLCBkaWZmX2Rvd25fcGx1cywgZGlmZl9kb3duX21pbnVzICAgKXsgCgoKZGlmZi51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX3VwX3BsdXMpCmRpZmYudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfdXBfbWludXMpCmRpZmYuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX2Rvd25fcGx1cykKZGlmZi5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShkaWZmX2Rvd25fbWludXMpCmRpZmYudXBfbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KZGlmZi5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKZGlmZi5UT1RBTCA8LSBwbG90X2RlbnNpdHkoZGlmZi51cF9wbHVzLCBkaWZmLnVwX21pbnVzLCBkaWZmLmRvd25fcGx1cywgZGlmZi5kb3duX21pbnVzKQoKCmVxbC51cF9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfdXBfcGx1cykKZXFsLnVwX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfdXBfbWludXMpCmVxbC5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGVxbF9kb3duX3BsdXMpCmVxbC5kb3duX21pbnVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfZG93bl9taW51cykKZXFsLnVwX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCmVxbC5kb3duX21pbnVzWyxQb3NpdGlvbjo9UG9zaXRpb24qLTFdCgoKZXFsLlRPVEFMIDwtIHBsb3RfZGVuc2l0eShlcWwudXBfcGx1cywgZXFsLnVwX21pbnVzLCBlcWwuZG93bl9wbHVzLCBlcWwuZG93bl9taW51cykKCmRpZmYuVE9UQUxbLCB0eXBlOj0iZGlmZiJdCmVxbC5UT1RBTFssIHR5cGU6PSJlcWwiXQoKZGlmZl9lcWwuVE9UQUwgPC0gcmJpbmQoZGlmZi5UT1RBTCwgZXFsLlRPVEFMKQoKCmdncGxvdChkaWZmX2VxbC5UT1RBTCkgKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbiwgeT1FbnJyaWNobWVudCwgY29sb3I9dHlwZSkpICsKICB4bGltKGMoLTI1MCwyNTApKSArCiAgZmFjZXRfZ3JpZCguIH4gZXhvbl9wb3MgICkgKwogIGxhYnMoY29sb3VyID0gIlBvdGFzc2l1bSBlZmZlY3QiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpIAoKfQpgYGAKCgoKCgoKCgoKYGBge3J9CgoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwgPC0gZnVuY3Rpb24oZXFsX3VwX3BsdXMsIGVxbF91cF9taW51cywgZXFsX2Rvd25fcGx1cywgZXFsX2Rvd25fbWludXMsIGRpZmZfdXBfcGx1cywgZGlmZl91cF9taW51cywgZGlmZl9kb3duX3BsdXMsIGRpZmZfZG93bl9taW51cywgVE9UQUwuZXFsLCBUT1RBTC5kaWZmLCBzaWcgICApeyAKCgpkaWZmLnVwX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfdXBfcGx1cykKZGlmZi51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZGlmZl91cF9taW51cykKZGlmZi5kb3duX3BsdXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfZG93bl9wbHVzKQpkaWZmLmRvd25fbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlKGRpZmZfZG93bl9taW51cykKZGlmZi51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQpkaWZmLmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCgpkaWZmLlRPVEFMIDwtIHBsb3RfZGVuc2l0eV9iaW5vbWlhbChkaWZmLnVwX3BsdXMsIGRpZmYudXBfbWludXMsIGRpZmYuZG93bl9wbHVzLCBkaWZmLmRvd25fbWludXMsIFRPVEFMLmRpZmYsIHNpZykKCgplcWwudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX3VwX3BsdXMpCmVxbC51cF9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX3VwX21pbnVzKQplcWwuZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZShlcWxfZG93bl9wbHVzKQplcWwuZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGUoZXFsX2Rvd25fbWludXMpCmVxbC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQplcWwuZG93bl9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQoKCmVxbC5UT1RBTCA8LSBwbG90X2RlbnNpdHlfYmlub21pYWwoZXFsLnVwX3BsdXMsIGVxbC51cF9taW51cywgZXFsLmRvd25fcGx1cywgZXFsLmRvd25fbWludXMsIFRPVEFMLmVxbCwgc2lnKQoKZGlmZi5UT1RBTFssIHR5cGU6PSJkaWZmIl0KZXFsLlRPVEFMWywgdHlwZTo9ImVxbCJdCgpkaWZmX2VxbC5UT1RBTCA8LSByYmluZChkaWZmLlRPVEFMLCBlcWwuVE9UQUwpCgoKZ2dwbG90KGRpZmZfZXFsLlRPVEFMKSArCiAgZ2VvbV9saW5lKGFlcyh4PVBvc2l0aW9uLCB5PUVucnJpY2htZW50LCBjb2xvcj10eXBlKSkgKwogICBnZW9tX3JpYmJvbihhZXMoeW1pbj1FbnJyaWNobWVudF9sLCB5bWF4PUVucnJpY2htZW50X3UsIHg9UG9zaXRpb24sIGZpbGw9dHlwZSksIGFscGhhPTAuMyApKwogIHhsaW0oYygtMjUwLDI1MCkpICsKICBmYWNldF9ncmlkKC4gfiBleG9uX3BvcyAgKSArCiAgbGFicyhjb2xvdXIgPSAiUG90YXNzaXVtIGVmZmVjdCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjNjY5OTAwIiwgImdyZXkiKSkgKyAgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjNjY5OTAwIiwgImRhcmtncmV5IikpCgoKCgp9CmBgYAoKCgpgYGB7cn0KS0NMX2h1bWFuIDwtIGZyZWFkKCIuL0tDTC9NaWNyb0V4b25hdG9yL0NvbnRyb2xfdnNfS0NMLmRpZmYiLCBzZXA9Ilx0IikKS0NMX2h1bWFuIDwtIEtDTF9odW1hblssIDE6MTFdCmNvbG5hbWVzKEtDTF9odW1hbikgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKaHVtYW4uQ0UuTkEgPC0gbnJvdyhLQ0xfaHVtYW5bKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCmh1bWFuLkNFLmRpZmYgPC0gbnJvdyhLQ0xfaHVtYW5bYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgpLQ0xfRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMSA8LSBmcmVhZCgiLi9LQ0wvTWljcm9FeG9uYXRvci9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX0VTQ19kZXJpdmVkX25ldXJvbl9DRDEgIDwtIEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxIFssIDE6MTFdCmNvbG5hbWVzKEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSA8LSBucm93KEtDTF9FU0NfZGVyaXZlZF9uZXVyb25fQ0QxIFsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmIDwtIG5yb3coS0NMX0VTQ19kZXJpdmVkX25ldXJvbl9DRDFbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgoKCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgIDwtIGZyZWFkKCIuL0tDTC9NaWNyb0V4b25hdG9yL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmIiwgc2VwPSJcdCIpCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgIDwtIEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgWywgMToxMV0KY29sbmFtZXMoS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMSApIDwtIGMoIkdlbmUiLCJOb2RlIiwgIkNvb3JkIiwgIlN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkNvbXBsZXhpdHkiLCAiRW50cm9weSIpCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5OQSA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgWyhhYnMoRGVsdGFQc2kpPDAuMSB8IFByb2JhYmlsaXR5PDAuOSkgICYgIFR5cGU9PSJDRSJdKQpwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuZGlmZiA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEgW2FicyhEZWx0YVBzaSk+PTAuMSAmIFByb2JhYmlsaXR5Pj0wLjkgJiAgVHlwZT09IkNFIl0pCgoKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxICA8LSBmcmVhZCgiLi9LQ0wvTWljcm9FeG9uYXRvci9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmIiwgc2VwPSJcdCIpCktDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSAgPC0gS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxIFssIDE6MTFdCmNvbG5hbWVzKEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSApIDwtIGMoIkdlbmUiLCJOb2RlIiwgIkNvb3JkIiwgIlN0cmFuZCIsICJUeXBlIiwgIlBzaV9BIiwgIlBzaV9CIiwgIkRlbHRhUHNpIiwgIlByb2JhYmlsaXR5IiwgIkNvbXBsZXhpdHkiLCAiRW50cm9weSIpCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLk5BIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxIFsoYWJzKERlbHRhUHNpKTwwLjEgfCBQcm9iYWJpbGl0eTwwLjkpICAmICBUeXBlPT0iQ0UiXSkKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuZGlmZiA8LSBucm93KEtDTF9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMSBbYWJzKERlbHRhUHNpKT49MC4xICYgUHJvYmFiaWxpdHk+PTAuOSAmICBUeXBlPT0iQ0UiXSkKCgoKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSAgPC0gZnJlYWQoIi4vS0NML01pY3JvRXhvbmF0b3IvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmYiLCBzZXA9Ilx0IikKS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSAgPC0gS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSBbLCAxOjExXQpjb2xuYW1lcyhLQ0xfcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxICkgPC0gYygiR2VuZSIsIk5vZGUiLCAiQ29vcmQiLCAiU3RyYW5kIiwgIlR5cGUiLCAiUHNpX0EiLCAiUHNpX0IiLCAiRGVsdGFQc2kiLCAiUHJvYmFiaWxpdHkiLCAiQ29tcGxleGl0eSIsICJFbnRyb3B5IikKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMSBbKGFicyhEZWx0YVBzaSk8MC4xIHwgUHJvYmFiaWxpdHk8MC45KSAgJiAgVHlwZT09IkNFIl0pCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5DRS5kaWZmIDwtIG5yb3coS0NMX3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMVthYnMoRGVsdGFQc2kpPj0wLjEgJiBQcm9iYWJpbGl0eT49MC45ICYgIFR5cGU9PSJDRSJdKQoKCmBgYAoKCgpgYGB7cn0KCiBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuQWxsX0c0LnRzdi5jbGVhbi50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5BbGxfRzQudHN2LmNsZWFuLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCmh1bWFuLkNFLk5BLApodW1hbi5DRS5kaWZmLAowLjA1CikKCgpgYGAKCgoKCmBgYHtyfQoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5OQSwKRVNDX2Rlcml2ZWRfbmV1cm9uX0NEMS5DRS5kaWZmLAowLjA1KQpgYGAKCgoKCgpgYGB7cn0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5tbTEwLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9TU19lbnJpY2htZW50L3BsdXNfbWludXMvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5kaWZmLAowLjA1KQpgYGAKCgoKCgoKCgoKCmBgYHtyfQoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuZGlmZiwKMC4wNQopCmBgYAoKCgoKCgoKCgoKYGBge3J9CgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML1NTX2VucmljaG1lbnQvcGx1c19taW51cy9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUubW0xMC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvU1NfZW5yaWNobWVudC9wbHVzX21pbnVzL3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLm1tMTAudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiwKMC4wNSkKYGBgCgoKCgoKCgojIyMgRzRzZXEgCgoKCgoKYGBge3J9CgpwbG90X2VxbF9kaWZmKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLCAKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iCgopCmBgYAoKCmBgYHtyfQoKRmlnNS5DIDwtIHBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsIAoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvQ29udHJvbF92c19LQ0wuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCmh1bWFuLkNFLk5BLApodW1hbi5DRS5kaWZmLAowLjA1KQoKCkZpZzUuYyA8LSBGaWc1LkMgK3lsaW0oIGMoMC40LCAyLjEpKQoKRmlnNS5jCmBgYAoKCgoKYGBge3J9CgoKCkZpZzUuRCA8LSBwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9Db250cm9sX3ZzX0tDTC5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0NvbnRyb2xfdnNfS0NMLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCmh1bWFuLkNFLk5BLApodW1hbi5DRS5kaWZmLAowLjA1CikKCgpGaWc1LkQgPC0gRmlnNS5EICt5bGltKCBjKDAuNCwgMi4xKSkKRmlnNS5ECmBgYAoKCgoKYGBge3J9CgoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuTkEsCkVTQ19kZXJpdmVkX25ldXJvbl9DRDEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKYGBge3J9CgoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvRVNDLWRlcml2ZWRfbmV1cm9uX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9FU0MtZGVyaXZlZF9uZXVyb25fQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L0VTQy1kZXJpdmVkX25ldXJvbl9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgpFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLk5BLApFU0NfZGVyaXZlZF9uZXVyb25fQ0QxLkNFLmRpZmYsCjAuMDUKCikKCmBgYAoKCgoKCgpgYGB7cn0KCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCgoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiwKMC4wNQopCgpgYGAKCgoKYGBge3J9CgoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9DRDEuQ0UuZGlmZiwKMC4wNQopCgpgYGAKCgoKCgpgYGB7cn0KCgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5DRS5OQSwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLmRpZmYsCjAuMDUKCikKCmBgYAoKCgoKCmBgYHtyfQoKCnBsb3RfZXFsX2RpZmZfYmlub21pYWwoCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjEwX1RjMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWMTBfVGMxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVYxMF9UYzEuQ0UuZGlmZiwKMC4wNQoKKQoKYGBgCgoKCgoKYGBge3J9CgoKcGxvdF9lcWxfZGlmZl9iaW5vbWlhbCgKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9sZXNzLmJlZC5wbHVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCgoKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl91cHN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLk5BLApwcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5DRS5kaWZmLAowLjA1CgopCgpgYGAKCgoKCgpgYGB7cn0KCgpwbG90X2VxbF9kaWZmX2Jpbm9taWFsKAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX2xlc3MuYmVkLm1pbnVzLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5iZWQubGlzdC5vdXQubnVtIiwKIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvS0NML0c0c2VxX2VucmljaG1lbnQvcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuZGlmZl9kb3duc3RyZWFtX2xlc3MuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX2Rvd25zdHJlYW1fbGVzcy5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfdXBzdHJlYW1fcHJvYl8wXzkuYmVkLnBsdXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9LQ0wvRzRzZXFfZW5yaWNobWVudC9wcmltYXJ5X2NvcnRpY2FsX25ldXJvbl9ESVY0X0NEMS5kaWZmX3Vwc3RyZWFtX3Byb2JfMF85LmJlZC5taW51cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQucGx1cy5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4uYmVkLmxpc3Qub3V0Lm51bSIsCiJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0tDTC9HNHNlcV9lbnJpY2htZW50L3ByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLmRpZmZfZG93bnN0cmVhbV9wcm9iXzBfOS5iZWQubWludXMuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLmJlZC5saXN0Lm91dC5udW0iLAoKcHJpbWFyeV9jb3J0aWNhbF9uZXVyb25fRElWNF9DRDEuQ0UuTkEsCnByaW1hcnlfY29ydGljYWxfbmV1cm9uX0RJVjRfQ0QxLkNFLmRpZmYsCjAuMDUKKQoKYGBgCgoKIyMjIHNtb290aCAjIyMKCgoKCmBgYHtyfQoKcmVwKDE6MTk5OSwgZWFjaD00KQoKZGlmZl9lcWwuVE9UQUxbICwgYmluOj1yZXAoMToxOTk5LCBlYWNoPTQpIF0KCgpkaWZmX2VxbC5UT1RBTFssIG1lYW5fRW5ycmljaG1lbnQ6PW1lYW4oRW5ycmljaG1lbnQpICwgYnk9YmluXQoKCmdncGxvdChkaWZmX2VxbC5UT1RBTCkgKwogIGdlb21fbGluZShhZXMoeD1Qb3NpdGlvbiwgeT1tZWFuX0VucnJpY2htZW50LCBjb2xvcj10eXBlKSkgKwogIHhsaW0oYygtMjUwLDI1MCkpICsKICBmYWNldF9ncmlkKC4gfiBleG9uX3BvcyAgKSArCiAgbGFicyhjb2xvdXIgPSAiUG90YXNzaXVtIGVmZmVjdCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgCmBgYAoKCiNJbnRyb24gbGVuZ2h0CgoKYGBge3J9CmludHJvbl91cHN0cmVhbSA8LSBmcmVhZCgiLi9GaWd1cmVzL0ZpZ3VyZTMvSW50cm9ucy5oZzE5X3Vwc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQuaW50ZXJzZWN0X2MuRzRzIikKaW50cm9uX2Rvd25zdHJlYW0gPC0gZnJlYWQoIi4vRmlndXJlcy9GaWd1cmUzL0ludHJvbnMuaGcxOV9kb3duc3RyZWFtXzEwMG50X3dpbmRvdy5iZWQuaW50ZXJzZWN0X2MuRzRzIikKCmNvbG5hbWVzKGludHJvbl91cHN0cmVhbSkgPC0gYygiY2hyb20iLCAic3RhcnQiLCAiZW5kIiwgInN0cmFuZCIsICJJRCIsICJpbnRyb25fc2l6ZSIsICJ0cmFuc2NyaXB0IiwgIkc0IikKY29sbmFtZXMoaW50cm9uX2Rvd25zdHJlYW0pIDwtIGMoImNocm9tIiwgInN0YXJ0IiwgImVuZCIsICJzdHJhbmQiLCAiSUQiLCAiaW50cm9uX3NpemUiLCAidHJhbnNjcmlwdCIsICJHNCIpCgppbnRyb25fdXBzdHJlYW1bLCBwb3M6PSJVcHN0cmVhbSBpbnRyb24iXQppbnRyb25fZG93bnN0cmVhbVssIHBvczo9IkRvd25zdHJlYW0gaW50cm9uIl0KCmludHJvbl9zaXplIDwtICByYmluZChpbnRyb25fdXBzdHJlYW0sIGludHJvbl9kb3duc3RyZWFtKQppbnRyb25fc2l6ZSRwb3MgPC0gZmFjdG9yKGludHJvbl9zaXplJHBvcywgbGV2ZWw9YygiVXBzdHJlYW0gaW50cm9uIiwgIkRvd25zdHJlYW0gaW50cm9uIikpCgoKRmlnMy5CIDwtIGdncGxvdChpbnRyb25fc2l6ZSkgKwogIGdlb21fZGVuc2l0eShhZXMoaW50cm9uX3NpemUsIGNvbG91cj1HND4wKSkgKwogIGZhY2V0X2dyaWQoLiB+IHBvcykgKwogIHhsaW0oYyg1MCw1MDAwKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQoKRmlnMy5CCmBgYAoKYGBge3J9CmtzLnRlc3QoaW50cm9uX3NpemVbRzQ+MCwgaW50cm9uX3NpemVdLCBpbnRyb25fc2l6ZVtHND09MCwgaW50cm9uX3NpemVdKQpgYGAKCgoKYGBge3J9CnNpemVfaW50IDwtIGMoc2VxKDAsNTAwMCwxMCksIGMoMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDApKQoKCmludHJvbl9zaXplJGludF9jb3VudCA8LSBjdXQoaW50cm9uX3NpemUkaW50cm9uX3NpemUsIHNpemVfaW50KQoKCmludF9jb3VudHNfdXBfd19HNCA8LSB0YWJsZShpbnRyb25fc2l6ZVtwb3M9PSJVcHN0cmVhbSBpbnRyb24iICYgRzQ+MCwgXSRpbnRfY291bnQpCmludF9jb3VudHNfdXBfd29fRzQgPC0gdGFibGUoaW50cm9uX3NpemVbcG9zPT0iVXBzdHJlYW0gaW50cm9uIiAmIEc0PT0wLCBdJGludF9jb3VudCkKaW50X2NvdW50c191cCA8LSByYmluZChpbnRfY291bnRzX3VwX3dfRzQsIGludF9jb3VudHNfdXBfd29fRzQpCmNvbG5hbWVzKGludF9jb3VudHNfdXApIDwtIGMoc2VxKDEwLDUwMDAsMTApLCBjKDEwMDAwLCAxMDAwMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSkKaW50X2NvdW50c191cCA8LSBtZWx0KGludF9jb3VudHNfdXApCgoKaW50X2NvdW50c19kb3duX3dfRzQgPC0gdGFibGUoaW50cm9uX3NpemVbcG9zPT0iRG93bnN0cmVhbSBpbnRyb24iICYgRzQ+MCwgXSRpbnRfY291bnQpCmludF9jb3VudHNfZG93bl93b19HNCA8LSB0YWJsZShpbnRyb25fc2l6ZVtwb3M9PSJEb3duc3RyZWFtIGludHJvbiIgJiBHND09MCwgXSRpbnRfY291bnQpCmludF9jb3VudHNfZG93biA8LSByYmluZChpbnRfY291bnRzX2Rvd25fd19HNCwgaW50X2NvdW50c19kb3duX3dvX0c0KQpjb2xuYW1lcyhpbnRfY291bnRzX2Rvd24pIDwtIGMoc2VxKDEwLDUwMDAsMTApLCBjKDEwMDAwLCAxMDAwMDAsIDEwMDAwMDAsIDEwMDAwMDAwKSkKaW50X2NvdW50c19kb3duIDwtIG1lbHQoaW50X2NvdW50c19kb3duKQoKaW50cm9uX3NpemVfaW50cyA8LSByYmluZChpbnRfY291bnRzX3VwLCBpbnRfY291bnRzX2Rvd24pCgpjb2xuYW1lcyhpbnRyb25fc2l6ZV9pbnRzKSA8LSBjKCJmYWN0b3IiLCAiaW50IiwgImNvdW50IikKCmludHJvbl9zaXplX2ludHMgPC0gZGF0YS50YWJsZShpbnRyb25fc2l6ZV9pbnRzKQoKCmludHJvbl9zaXplX2ludHNbICwgdG90YWw6PXN1bShjb3VudCkgLCBieT0iZmFjdG9yIiBdCmludHJvbl9zaXplX2ludHNbICwgZnJhYzo9KGNvdW50L3RvdGFsKSBdCgppbnRyb25fc2l6ZV9pbnRzX3VwIDwtIG1lcmdlKGludHJvbl9zaXplX2ludHNbIGZhY3Rvcj09ImludF9jb3VudHNfdXBfd19HNCIsIF0sIGludHJvbl9zaXplX2ludHNbIGZhY3Rvcj09ImludF9jb3VudHNfdXBfd29fRzQiLCBdLCBieT0iaW50IiApCmludHJvbl9zaXplX2ludHNfdXBbICwgcmVsYXRpdmVfZnJhYzo9ZnJhYy54L2ZyYWMueSBdCgppbnRyb25fc2l6ZV9pbnRzX2Rvd24gPC0gbWVyZ2UoaW50cm9uX3NpemVfaW50c1sgZmFjdG9yPT0iaW50X2NvdW50c19kb3duX3dfRzQiLCBdLCBpbnRyb25fc2l6ZV9pbnRzWyBmYWN0b3I9PSJpbnRfY291bnRzX2Rvd25fd29fRzQiLCBdLCBieT0iaW50IiApCmludHJvbl9zaXplX2ludHNfZG93blsgLCByZWxhdGl2ZV9mcmFjOj1mcmFjLngvZnJhYy55IF0KCmludHJvbl9zaXplX2ludHNfdXBbLCBwb3M6PSJVcHN0cmVhbSBpbnRyb24iXQppbnRyb25fc2l6ZV9pbnRzX2Rvd25bLCBwb3M6PSJEb3duc3RyZWFtIGludHJvbiJdCgppbnRyb25fc2l6ZV9pbnRzX3RvdGFsIDwtIHJiaW5kKGludHJvbl9zaXplX2ludHNfdXAsIGludHJvbl9zaXplX2ludHNfZG93bikKCmludHJvbl9zaXplX2ludHNfdG90YWwkcG9zIDwtIGZhY3RvcihpbnRyb25fc2l6ZV9pbnRzX3RvdGFsJHBvcywgbGV2ZWw9YygiVXBzdHJlYW0gaW50cm9uIiwgIkRvd25zdHJlYW0gaW50cm9uIikpCgoKCkZpZzMuQyA8LSBnZ3Bsb3QoaW50cm9uX3NpemVfaW50c190b3RhbCwgYWVzKGludCwgbG9nMihyZWxhdGl2ZV9mcmFjKSkgICkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgc3RhdF9zbW9vdGgoIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4gcG9seSh4LCA4KSkgKwogIHhsaW0oYygwLCAyMDAwKSkgKwogIHlsaW0oYygtMiwyKSkgKwogIGZhY2V0X2dyaWQoLiB+IHBvcykKCkZpZzMuQwoKYGBgCgoKCmBgYHtyfQoKaW50cm9uX3NpemVfaW50c190b3RhbFsgcmVsYXRpdmVfZnJhYyAlaW4lIGludHJvbl9zaXplX2ludHNfdG90YWxbLCBtYXgocmVsYXRpdmVfZnJhYyksIGJ5PXBvc10kVjEsIF0KCmBgYAoKCgpgYGB7cn0KIFVwc3RyZWFtX1UyX3Njb3JlX2xlbiA8LSBmcmVhZCgiLi9GaWd1cmVzL0ZpZ3VyZTMvVXBzdHJlYW1fVTJfc2NvcmVfbGVuX21hdHJpeC50eHQyLm9sZCIpCiBEb3duc3RyZWFtX1UyX3Njb3JlX2xlbiA8LSBmcmVhZCgiLi9GaWd1cmVzL0ZpZ3VyZTMvRG93bnN0cmVhbV9VMl9zY29yZV9sZW5fbWF0cml4LnR4dDIub2xkIikKIAogCiBVcHN0cmVhbV9VMl9zY29yZV9sZW4gPC1kYXRhLnRhYmxlOjptZWx0KFVwc3RyZWFtX1UyX3Njb3JlX2xlbiwgaWQudmFycz0nSUwnKQpEb3duc3RyZWFtX1UyX3Njb3JlX2xlbiA8LSBkYXRhLnRhYmxlOjptZWx0KERvd25zdHJlYW1fVTJfc2NvcmVfbGVuLCBpZC52YXJzPSdJTCcpCgpVcHN0cmVhbV9VMl9zY29yZV9sZW5bLCBwb3M6PSJVcHN0cmVhbSBpbnRyb24iXQpEb3duc3RyZWFtX1UyX3Njb3JlX2xlblssIHBvczo9IkRvd25zdHJlYW0gaW50cm9uIl0KCgogCkZpZzMuRDEgPC0gIGdncGxvdChVcHN0cmVhbV9VMl9zY29yZV9sZW4pICsKICAgZ2VvbV90aWxlKCBhZXModmFyaWFibGUsIGFzLmZhY3RvcihJTCksIGZpbGwgPSB2YWx1ZSoxMDApKSArCiAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAxMi41LCBsaW1pdHMgPSBjKDAsIDI1KSkgKwogICBmYWNldF9ncmlkKC4gfiBwb3MpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpCiAKIApGaWczLkQyIDwtICBnZ3Bsb3QoRG93bnN0cmVhbV9VMl9zY29yZV9sZW4pICsKICAgZ2VvbV90aWxlKCBhZXModmFyaWFibGUsIGFzLmZhY3RvcihJTCksIGZpbGwgPSB2YWx1ZSoxMDApKSArCiAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIG1pZCA9ICJncmV5IiwgbWlkcG9pbnQgPSAxMi41LCBsaW1pdHMgPSBjKDAsIDI1KSkgKwogICBmYWNldF9ncmlkKC4gfiBwb3MpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpCgpGaWczLkQgPC0gcGxvdF9ncmlkKEZpZzMuRDEsIEZpZzMuRDIpCiBGaWczLkQKYGBgCgoKCgpgYGB7cn0KCmNsb3Nlc3RfZzQgPC0gZnVuY3Rpb24oZGlzdC5leG9uX3VwX3BsdXNfcGF0aCwgZGlzdC5leG9uX3VwX21pbnVzX3BhdGgsIGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCwgZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCl7CgpkaXN0LmV4b25fdXBfcGx1cyA8LSBmcmVhZChkaXN0LmV4b25fdXBfcGx1c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fdXBfcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX3BsdXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fdXBfcGx1c1sgLCAgZGlzdDo9Z21pZCAtIGVzdGFydF0KCgpkaXN0LmV4b25fdXBfbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX3VwX21pbnVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl91cF9taW51cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX3VwX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX3VwX21pbnVzWyAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpkaXN0LmV4b25fZG93bl9wbHVzIDwtIGZyZWFkKGRpc3QuZXhvbl9kb3duX3BsdXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fcGx1cykgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIiwgImdzY29yZSIsICJleG9uX2Rpc3QiKQoKZGlzdC5leG9uX2Rvd25fcGx1c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl9kb3duX3BsdXNbICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCgoKZGlzdC5leG9uX2Rvd25fbWludXMgPC0gZnJlYWQoZGlzdC5leG9uX2Rvd25fbWludXNfcGF0aCkKY29sbmFtZXMoZGlzdC5leG9uX2Rvd25fbWludXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICJnc2NvcmUiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl9kb3duX21pbnVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX2Rvd25fbWludXNbICwgIGRpc3Q6PSBlc3RhcnQgLSBnbWlkXQoKCmRpc3QuZXhvbl91cCA8LSByYmluZChkaXN0LmV4b25fdXBfcGx1cywgZGlzdC5leG9uX3VwX21pbnVzKSAKZGlzdC5leG9uX2Rvd24gPC0gcmJpbmQoZGlzdC5leG9uX2Rvd25fcGx1cywgZGlzdC5leG9uX2Rvd25fbWludXMpCgpkaXN0LmV4b25fdXBbLCBwb3M6PSIzJ1NwbGljZSBzaXRlIl0KZGlzdC5leG9uX2Rvd25bLCBwb3M6PSI1J1NwbGljZSBzaXRlIl0KCmRpc3QuZXhvbiA8LSByYmluZChkaXN0LmV4b25fdXAsIGRpc3QuZXhvbl9kb3duKQoKcmV0dXJuKGRpc3QuZXhvbikKCn0KCgoKYGBgCgoKCmBgYHtyfQpleG9uLnVwLm1vdGlmIDwtIGZyZWFkKCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9ucy51cC5jbG9zZXN0X0c0X2NsZWFuIikKY29sbmFtZXMoZXhvbi51cC5tb3RpZikgPC0gYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImV4b24iLCAiY2VybyIsICJzdHJhbmQiLCAiZ2Nocm9tIiwgImdzdGFydCIsICJnZW5kIikKCmV4b24udXAubW90aWZbICwgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZXhvbi51cC5tb3RpZlsgIHN0cmFuZD09IisiICAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQpleG9uLnVwLm1vdGlmWyAgc3RyYW5kPT0iLSIgICwgIGRpc3Q6PSBlc3RhcnQgLSBnbWlkXQoKCmV4b24uZG93bi5tb3RpZiA8LSBmcmVhZCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbnMuZG93bi5jbG9zZXN0X0c0X2NsZWFuIikKY29sbmFtZXMoZXhvbi5kb3duLm1vdGlmKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiKQoKZXhvbi5kb3duLm1vdGlmWyAsIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmV4b24uZG93bi5tb3RpZlsgIHN0cmFuZD09IisiICAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQpleG9uLmRvd24ubW90aWZbICBzdHJhbmQ9PSItIiAgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKCmV4b24udXAubW90aWZbLCBwb3M6PSIzJ1NwbGljZSBzaXRlIl0KZXhvbi5kb3duLm1vdGlmWywgcG9zOj0iNSdTcGxpY2Ugc2l0ZSJdCgpleG9uLmRpc3QubW90aWYgPC0gcmJpbmQoZXhvbi51cC5tb3RpZiwgZXhvbi5kb3duLm1vdGlmKQoKCmdncGxvdChleG9uLmRpc3QubW90aWYpICsKICBnZW9tX2RlbnNpdHkoYWVzKGRpc3QpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoLiB+IHBvcykKIApgYGAKCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03fQoKY2xvc2VzdF9nNF9LQ0wgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCgoKY2xvc2VzdF9nNF9QRFMgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMWywgVHlwZTo9Ikc0LXNlcSBLKyJdCmNsb3Nlc3RfZzRfUERTWywgVHlwZTo9Ikc0LXNlcSBQRFMiXQpleG9uLmRpc3QubW90aWZbLCBUeXBlOj0iQ29uc2Vuc3VzIEc0IG1vdGlmIl0KCgpjbG9zZXN0X2c0X0tDTCA8LSB1bmlxdWUoY2xvc2VzdF9nNF9LQ0xbICwgYygiZWNocm9tIiwgImVzdGFydCIsICJlZW5kIiwgImRpc3QiLCAicG9zIiwgIlR5cGUiKV0pCmNsb3Nlc3RfZzRfUERTIDwtIHVuaXF1ZShjbG9zZXN0X2c0X1BEU1sgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAgIlR5cGUiKV0pCmV4b24uZGlzdC5tb3RpZiA8LSB1bmlxdWUoZXhvbi5kaXN0Lm1vdGlmWyAsIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJkaXN0IiwgInBvcyIsICJUeXBlIildKQoKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZiA8LSByYmluZChjbG9zZXN0X2c0X0tDTCwgY2xvc2VzdF9nNF9QRFMsIGV4b24uZGlzdC5tb3RpZikKCkZpZzEuQiA8LSBnZ3Bsb3QoY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyhkaXN0LCBjb2xvdXI9VHlwZSksIGJ3PTEwKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHlwZSB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoIGFuZ2xlID0gNDUpKSAKCkZpZzEuQiArIHhsaW0oYygtMzAwLCAzMDApKQoKYGBgCgoKCgoKCmBgYHtyfQoKI2Nsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZgoKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IgPC0gY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmW2FicyhkaXN0KTw9MTAwMCAsIF0KCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2JbLCBiaW46PWN1dChkaXN0LCBzZXEoLTEwMDAsIDEwMDAsIDUpLCBsYWJlbHM9IHNlcSgtOTk1LCAxMDAwLCA1KSwgaW5jbHVkZS5sb3dlc3Q9VFJVRSApIF0KCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQgPC0gY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYlsgLCAuKE9jY3VycmVuY2VzPS5OKSAsIGJ5PWMoImRpc3QiLCAicG9zIiwgIlR5cGUiKV0KCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQubWVkaWFuIDwtICBjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnRbLCAuKG1lZGlhbj1tZWRpYW4oT2NjdXJyZW5jZXMpKSwgYnk9YyggInBvcyIsICJUeXBlIikgXQoKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudCA8LSBtZXJnZShjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnQsIGNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudC5tZWRpYW4sIGJ5PWMoICJwb3MiLCAiVHlwZSIpKSAKCmNsb3Nlc3RfZzRfS0NMX1BEU19tb3RpZi4xa2IuZW5yaWNobWVudFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCgpjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnRbVHlwZT09IkNvbnNlbnN1cyBHNCBtb3RpZiIsIFR5cGU6PSJHNCBtb3RpZiIgXQoKCiNjbG9zZXN0X2c0X0tDTF9QRFNfbW90aWYuMWtiLmVucmljaG1lbnRbICwgYmluOj1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihiaW4pKV0KCgpnZ3Bsb3QoY2xvc2VzdF9nNF9LQ0xfUERTX21vdGlmLjFrYi5lbnJpY2htZW50KSArCiAgZ2VvbV9saW5lKGFlcyhkaXN0LCBFbnJyaWNobWVudCwgY29sb3VyPVR5cGUpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHlwZSB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkVucmljaG1lbnQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoIGFuZ2xlID0gNDUpKSAKCgoKCgoKYGBgCgoKCgpgYGB7cn0KCmNsb3Nlc3RfZzRfMjAxNSA8LSBmdW5jdGlvbihkaXN0LmV4b25fdXBfcGx1c19wYXRoLCBkaXN0LmV4b25fdXBfbWludXNfcGF0aCwgZGlzdC5leG9uX2Rvd25fcGx1c19wYXRoLCBkaXN0LmV4b25fZG93bl9taW51c19wYXRoKXsKCmRpc3QuZXhvbl91cF9wbHVzIDwtIGZyZWFkKGRpc3QuZXhvbl91cF9wbHVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl91cF9wbHVzKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl91cF9wbHVzWywgZ21pZDo9IGdzdGFydCArIChnZW5kLWdzdGFydCkvMl0KZGlzdC5leG9uX3VwX3BsdXNbICwgIGRpc3Q6PWdtaWQgLSBlc3RhcnRdCgoKZGlzdC5leG9uX3VwX21pbnVzIDwtIGZyZWFkKGRpc3QuZXhvbl91cF9taW51c19wYXRoKQpjb2xuYW1lcyhkaXN0LmV4b25fdXBfbWludXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl91cF9taW51c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl91cF9taW51c1sgLCAgZGlzdDo9IGVzdGFydCAtIGdtaWRdCgoKZGlzdC5leG9uX2Rvd25fcGx1cyA8LSBmcmVhZChkaXN0LmV4b25fZG93bl9wbHVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl9kb3duX3BsdXMpIDwtIGMoImVjaHJvbSIsICJlc3RhcnQiLCAiZWVuZCIsICJleG9uIiwgImNlcm8iLCAic3RyYW5kIiwgImdjaHJvbSIsICJnc3RhcnQiLCAiZ2VuZCIsICAiZXhvbl9kaXN0IikKCmRpc3QuZXhvbl9kb3duX3BsdXNbLCBnbWlkOj0gZ3N0YXJ0ICsgKGdlbmQtZ3N0YXJ0KS8yXQpkaXN0LmV4b25fZG93bl9wbHVzWyAsICBkaXN0Oj1nbWlkIC0gZXN0YXJ0XQoKCmRpc3QuZXhvbl9kb3duX21pbnVzIDwtIGZyZWFkKGRpc3QuZXhvbl9kb3duX21pbnVzX3BhdGgpCmNvbG5hbWVzKGRpc3QuZXhvbl9kb3duX21pbnVzKSA8LSBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZXhvbiIsICJjZXJvIiwgInN0cmFuZCIsICJnY2hyb20iLCAiZ3N0YXJ0IiwgImdlbmQiLCAgImV4b25fZGlzdCIpCgpkaXN0LmV4b25fZG93bl9taW51c1ssIGdtaWQ6PSBnc3RhcnQgKyAoZ2VuZC1nc3RhcnQpLzJdCmRpc3QuZXhvbl9kb3duX21pbnVzWyAsICBkaXN0Oj0gZXN0YXJ0IC0gZ21pZF0KCgpkaXN0LmV4b25fdXAgPC0gcmJpbmQoZGlzdC5leG9uX3VwX3BsdXMsIGRpc3QuZXhvbl91cF9taW51cykgCmRpc3QuZXhvbl9kb3duIDwtIHJiaW5kKGRpc3QuZXhvbl9kb3duX3BsdXMsIGRpc3QuZXhvbl9kb3duX21pbnVzKQoKZGlzdC5leG9uX3VwWywgcG9zOj0iMydTcGxpY2Ugc2l0ZSJdCmRpc3QuZXhvbl9kb3duWywgcG9zOj0iNSdTcGxpY2Ugc2l0ZSJdCgpkaXN0LmV4b24gPC0gcmJpbmQoZGlzdC5leG9uX3VwLCBkaXN0LmV4b25fZG93bikKCnJldHVybihkaXN0LmV4b24pCgp9CgoKCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTd9CgpjbG9zZXN0X2c0X0tDTF8yMDE1IDwtIGNsb3Nlc3RfZzRfMjAxNSgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX0tfcGx1c19taW51c19oaXRzX2ludGVyc2VjdC5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIikKCgoKY2xvc2VzdF9nNF9QRFNfMjAxNSA8LSBjbG9zZXN0X2c0XzIwMTUoIi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuaGcxOS5jbG9zZXN0LkdTRTYzODc0X05hX1BEU19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfUERTX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIikKCgpjbG9zZXN0X2c0X0tDTF8yMDE1WywgVHlwZTo9Ikc0LXNlcSBOYSsgSysiXQpjbG9zZXN0X2c0X1BEU18yMDE1WywgVHlwZTo9Ikc0LXNlcSBOYSsgUERTIl0KCgoKY2xvc2VzdF9nNF9LQ0xfMjAxNSA8LSB1bmlxdWUoY2xvc2VzdF9nNF9LQ0xfMjAxNVsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAiVHlwZSIpXSkKY2xvc2VzdF9nNF9QRFNfMjAxNSA8LSB1bmlxdWUoY2xvc2VzdF9nNF9QRFNfMjAxNVsgLCBjKCJlY2hyb20iLCAiZXN0YXJ0IiwgImVlbmQiLCAiZGlzdCIsICJwb3MiLCAgIlR5cGUiKV0pCgoKCmNsb3Nlc3RfZzRfS0NMX1BEU18yMDE1IDwtIHJiaW5kKGNsb3Nlc3RfZzRfS0NMXzIwMTUsIGNsb3Nlc3RfZzRfUERTXzIwMTUpCgpnZ3Bsb3QoY2xvc2VzdF9nNF9LQ0xfUERTXzIwMTUpICsKICBnZW9tX2xpbmUoYWVzKGRpc3QsIGNvbG91cj1UeXBlKSwgYnc9MTAsIHN0YXQ9ImRlbnNpdHkiKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHlwZSB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoIGFuZ2xlID0gNDUpKSAKCgoKYGBgCgoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTd9CmNsb3Nlc3RfZzRfS0NMLnNhY0NlcjMgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuY2xvc2VzdC5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCmNsb3Nlc3RfZzRfUERTLnNhY0NlcjMgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5jbG9zZXN0LkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLmNsb3Nlc3QuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMCA8LSBjbG9zZXN0X2c0KCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmJlZC50YWlyMTAuY2xvc2VzdC5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCmNsb3Nlc3RfZzRfUERTLnRhaXIxMCA8LSBjbG9zZXN0X2c0KCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5iZWQudGFpcjEwLmNsb3Nlc3QuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5iZWQudGFpcjEwLmNsb3Nlc3QuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5jbG9zZXN0LkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLmRhblJlcjEwIDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgoKY2xvc2VzdF9nNF9QRFMuZGFuUmVyMTAgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5kYW5SZXIxMC5jbG9zZXN0LkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLmNsb3Nlc3QuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLmRtNiA8LSBjbG9zZXN0X2c0KCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmRtNi5jbG9zZXN0LkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgoKY2xvc2VzdF9nNF9QRFMuZG02IDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuZG02LmNsb3Nlc3QuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5kbTYuY2xvc2VzdC5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiKQoKCmNsb3Nlc3RfZzRfS0NMLm1tMTAgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIpCgpjbG9zZXN0X2c0X1BEUy5tbTEwIDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLm1tMTAuY2xvc2VzdC5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5tbTEwLmNsb3Nlc3QuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wuaGcxOSA8LSBjbG9zZXN0X2c0KCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9taW51cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fcGx1cy5oZzE5LmNsb3Nlc3QuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQiKQoKY2xvc2VzdF9nNF9QRFMuaGcxOSA8LSBjbG9zZXN0X2c0KCIuL0ZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmVzL0ZpZ3VyZTEvZXhvbl9kb3duX3BsdXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuaGcxOS5jbG9zZXN0LkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKCmNsb3Nlc3RfZzRfS0NMLmNlMTAgPC0gY2xvc2VzdF9nNCgiLi9GaWd1cmVzL0ZpZ3VyZTEvZXhvbl91cF9wbHVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfbWludXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzdfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM3X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX2Rvd25fbWludXMuY2UxMC5jbG9zZXN0LkdTTTMwMDM1MzdfQ2VsZWdhbnNfYWxsX3cxNV90aC0xX3BsdXNfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkIikKCgpjbG9zZXN0X2c0X1BEUy5jZTEwIDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9GaWd1cmUxL2V4b25fdXBfcGx1cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzOF9DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvRmlndXJlMS9leG9uX3VwX21pbnVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9wbHVzLmNlMTAuY2xvc2VzdC5HU00zMDAzNTM4X0NlbGVnYW5zX2FsbF93MTVfdGgtMV9wbHVzX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9GaWd1cmUxL2V4b25fZG93bl9taW51cy5jZTEwLmNsb3Nlc3QuR1NNMzAwMzUzOF9DZWxlZ2Fuc19hbGxfdzE1X3RoLTFfcGx1c19taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZCIpCgoKCiAgCgoKY2xvc2VzdF9nNF9LQ0wuc2FjQ2VyM1ssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJTLiBjZXJldmlzaWFlIikgXQpjbG9zZXN0X2c0X1BEUy5zYWNDZXIzWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9IlMuIGNlcmV2aXNpYWUiKSBdCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMFssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJBLiB0aGFsaWFuYSIgKSBdCmNsb3Nlc3RfZzRfUERTLnRhaXIxMFssIGA6PWAoVHJlYXRtZW50PSJQRFMiLCBTcGVjaWVzPSJBLiB0aGFsaWFuYSIgKSBdCmNsb3Nlc3RfZzRfS0NMLmRhblJlcjEwWywgYDo9YChUcmVhdG1lbnQ9IktDbCIsIFNwZWNpZXM9IkQuIHJlcmlvIiAgKSBdCmNsb3Nlc3RfZzRfUERTLmRhblJlcjEwWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9IkQuIHJlcmlvIiAgKSBdCmNsb3Nlc3RfZzRfS0NMLmRtNlssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSAiRC4gbWVsYW5vZ2FzdGVyIiApIF0KY2xvc2VzdF9nNF9QRFMuZG02WywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9ICAiRC4gbWVsYW5vZ2FzdGVyIiApIF0KY2xvc2VzdF9nNF9LQ0wubW0xMFssIGA6PWAoVHJlYXRtZW50PSJLQ2wiLCBTcGVjaWVzPSJNLiBtdXNjdWx1cyIgICkgXQpjbG9zZXN0X2c0X1BEUy5tbTEwWywgYDo9YChUcmVhdG1lbnQ9IlBEUyIsIFNwZWNpZXM9Ik0uIG11c2N1bHVzIiAgKSBdCmNsb3Nlc3RfZzRfS0NMLmhnMTlbLCBgOj1gKFRyZWF0bWVudD0iS0NsIiwgU3BlY2llcz0iSC4gc2FwaWVucyIgICAgKSBdCmNsb3Nlc3RfZzRfUERTLmhnMTlbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iSC4gc2FwaWVucyIgICAgKSBdCmNsb3Nlc3RfZzRfS0NMLmNlMTBbLCBgOj1gKFRyZWF0bWVudD0iS0NsIiwgU3BlY2llcz0iQy4gZWxlZ2FucyIgICAgKSBdCmNsb3Nlc3RfZzRfUERTLmNlMTBbLCBgOj1gKFRyZWF0bWVudD0iUERTIiwgU3BlY2llcz0iQy4gZWxlZ2FucyIgICApIF0KCgpjbG9zZXN0X2c0LlRPVEFMIDwtIHJiaW5kKGNsb3Nlc3RfZzRfS0NMLnNhY0NlcjMsCmNsb3Nlc3RfZzRfUERTLnNhY0NlcjMsCmNsb3Nlc3RfZzRfS0NMLnRhaXIxMCwKY2xvc2VzdF9nNF9QRFMudGFpcjEwLApjbG9zZXN0X2c0X0tDTC5kYW5SZXIxMCwKY2xvc2VzdF9nNF9QRFMuZGFuUmVyMTAsCmNsb3Nlc3RfZzRfS0NMLmRtNiwKY2xvc2VzdF9nNF9QRFMuZG02LApjbG9zZXN0X2c0X0tDTC5tbTEwLApjbG9zZXN0X2c0X1BEUy5tbTEwLApjbG9zZXN0X2c0X0tDTC5oZzE5LApjbG9zZXN0X2c0X1BEUy5oZzE5LApjbG9zZXN0X2c0X0tDTC5oZzE5LApjbG9zZXN0X2c0X1BEUy5oZzE5KQoKCmdncGxvdChjbG9zZXN0X2c0LlRPVEFMKSArCiAgZ2VvbV9saW5lKGFlcyhkaXN0LCBjb2xvdXI9U3BlY2llcyksIGJ3PTEwLCBzdGF0PSJkZW5zaXR5IikgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFRyZWF0bWVudCB+IHBvcykgKwogIHhsYWIoIkRpc3RhbmNlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43LCAKICAgIGFuZ2xlID0gNDUpKSAKCgoKCmBgYAoKCgpgYGB7cn0KY2xvc2VzdF9nNC5UT1RBTC4xa2IgPC0gY2xvc2VzdF9nNC5UT1RBTFthYnMoZGlzdCk8PTEwMDAgLCBdCgpjbG9zZXN0X2c0LlRPVEFMLjFrYlssIGJpbjo9Y3V0KGRpc3QsIHNlcSgtMTAwMCwgMTAwMCwgNSksIGxhYmVscz0gc2VxKC05OTUsIDEwMDAsIDUpICkgXQoKCmNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQgPC0gY2xvc2VzdF9nNC5UT1RBTC4xa2JbICwgLihPY2N1cnJlbmNlcz0uTikgLCBieT1jKCJiaW4iLCAicG9zIiwgIlRyZWF0bWVudCIsICJTcGVjaWVzIildCgoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudC5tZWRpYW4gPC0gIGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnRbLCAuKG1lZGlhbj1tZWRpYW4oT2NjdXJyZW5jZXMpKSwgYnk9YyggInBvcyIsICJUcmVhdG1lbnQiLCAiU3BlY2llcyIpIF0KCgpjbG9zZXN0X2c0LlRPVEFMLjFrYi5lbnJpY2htZW50IDwtIG1lcmdlKGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQsIGNsb3Nlc3RfZzQuVE9UQUwuMWtiLmVucmljaG1lbnQubWVkaWFuLCBieT1jKCAicG9zIiwgIlRyZWF0bWVudCIsICJTcGVjaWVzIikpIAoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudFssIEVucnJpY2htZW50Oj1PY2N1cnJlbmNlcy9tZWRpYW5dCgoKY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudFsgLCBiaW46PWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGJpbikpXQoKCkZpZzYuRCA8LSBnZ3Bsb3QoY2xvc2VzdF9nNC5UT1RBTC4xa2IuZW5yaWNobWVudCkgKwogIGdlb21fbGluZShhZXMoYmluLCBFbnJyaWNobWVudCwgY29sb3VyPVNwZWNpZXMpKSArCiAgeGxpbShjKC0xMDAwLCAxMDAwKSkgKwogIGZhY2V0X2dyaWQoVHJlYXRtZW50IH4gcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRW5yaWNobWVudCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpIAoKRmlnNi5ECgpgYGAKCgoKCgpgYGB7cn0KCgoKcmVhZF9kaXN0X3RhYmxlX3BsdXNfbWludXMgPC0gZnVuY3Rpb24ocGF0aC5wbHVzLCBwYXRoLm1pbnVzICl7CiAgCmRpc3RfdGFibGUucGx1cyA8LSBkYXRhLnRhYmxlKHJlYWRfZGVsaW0ocGF0aC5wbHVzLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpKQoKZGlzdF90YWJsZS5wbHVzIDwtIGRpc3RfdGFibGUucGx1c1ssIDI6MjAwMV0KZGlzdF90YWJsZS5wbHVzIDwtIGRhdGEudGFibGUoYXMuZGF0YS5mcmFtZSh0KGRpc3RfdGFibGUucGx1cykpKQpjb2xuYW1lcyhkaXN0X3RhYmxlLnBsdXMpIDwtIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIikKCgpkaXN0X3RhYmxlLm1pbnVzIDwtIGRhdGEudGFibGUocmVhZF9kZWxpbShwYXRoLm1pbnVzLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpKQoKZGlzdF90YWJsZS5taW51cyA8LSBkaXN0X3RhYmxlLm1pbnVzWywgMjoyMDAxXQpkaXN0X3RhYmxlLm1pbnVzIDwtIGRhdGEudGFibGUoYXMuZGF0YS5mcmFtZSh0KGRpc3RfdGFibGUubWludXMpKSkKY29sbmFtZXMoZGlzdF90YWJsZS5taW51cykgPC0gYygiUG9zaXRpb24iLCAiT2NjdXJyZW5jZXMiKQoKIApkaXN0X3RhYmxlIDwtICBtZXJnZShkaXN0X3RhYmxlLnBsdXMsIGRpc3RfdGFibGUubWludXMsIGJ5PSJQb3NpdGlvbiIpCgpkaXN0X3RhYmxlWywgT2NjdXJyZW5jZXM6PShPY2N1cnJlbmNlcy54ICsgT2NjdXJyZW5jZXMueSldCgpkaXN0X3RhYmxlWywgT2NjdXJyZW5jZXM6PShPY2N1cnJlbmNlcy54ICsgT2NjdXJyZW5jZXMueSldCmRpc3RfdGFibGUgPC0gZGlzdF90YWJsZVssIGMoIlBvc2l0aW9uIiwgIk9jY3VycmVuY2VzIildCgoKZGlzdF90YWJsZVssbWVkaWFuOj1tZWRpYW4oT2NjdXJyZW5jZXMpXQpkaXN0X3RhYmxlWywgRW5ycmljaG1lbnQ6PU9jY3VycmVuY2VzL21lZGlhbl0KZGlzdF90YWJsZVssIFBvc2l0aW9uOj1Qb3NpdGlvbi0xXQoKcmV0dXJuKGRpc3RfdGFibGUpICAKfQoKCmBgYAoKCgoKCgoKYGBge3J9CgplbnJpY2htZW50X0c0X3NlcV9wbG90IDwtIGZ1bmN0aW9uKHBhdGgudXBfcGx1cy5wbHVzLCBwYXRoLnVwX3BsdXMubWludXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZG93bl9wbHVzLnBsdXMsIHBhdGguZG93bl9wbHVzLm1pbnVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnVwX21pbnVzLnBsdXMsIHBhdGgudXBfbWludXMubWludXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kb3duX21pbnVzLnBsdXMsIHBhdGguZG93bl9taW51cy5taW51cyApewoKCngudXBfcGx1cyA8LSByZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyhwYXRoLnVwX3BsdXMucGx1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC51cF9wbHVzLm1pbnVzKQoKCnguZG93bl9wbHVzIDwtIHJlYWRfZGlzdF90YWJsZV9wbHVzX21pbnVzKHBhdGguZG93bl9wbHVzLnBsdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZG93bl9wbHVzLm1pbnVzKQoKCngudXBfbWludXMgPC0gcmVhZF9kaXN0X3RhYmxlX3BsdXNfbWludXMocGF0aC51cF9taW51cy5wbHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnVwX21pbnVzLm1pbnVzKQoKCnguZG93bl9taW51cyA8LSByZWFkX2Rpc3RfdGFibGVfcGx1c19taW51cyhwYXRoLmRvd25fbWludXMucGx1cywKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmRvd25fbWludXMubWludXMpCgoKeC51cF9taW51c1ssUG9zaXRpb246PVBvc2l0aW9uKi0xXQp4LmRvd25fbWludXNbLFBvc2l0aW9uOj1Qb3NpdGlvbiotMV0KCnguVE9UQUwgPC0gcGxvdF9kZW5zaXR5KHgudXBfcGx1cywgeC51cF9taW51cywgeC5kb3duX3BsdXMsIHguZG93bl9taW51cykKCnJldHVybih4LlRPVEFMKQoKfQoKYGBgCgoKYGBge3J9CgpoZzE5LlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1MzlfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTM5X0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzUzOV9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCmhnMTkuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuaGcxOS5zY29yZS5HU00zMDAzNTQwX0hvbW9fYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmhnMTkuc2NvcmUuR1NNMzAwMzU0MF9Ib21vX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5oZzE5LnNjb3JlLkdTTTMwMDM1NDBfSG9tb19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKCgpzYWNDZXIzLlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTNfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTUzX1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1M19TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKc2FjQ2VyMy5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQuc2FjQ2VyMy5zY29yZS5HU00zMDAzNTU0X1NhY2Nhcm9teWNlc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnNhY0NlcjMuc2NvcmUuR1NNMzAwMzU1NF9TYWNjYXJvbXljZXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC5zYWNDZXIzLnNjb3JlLkdTTTMwMDM1NTRfU2FjY2Fyb215Y2VzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIpCgoKbW91c2UuVE9UQUwuS0NMIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ3X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDdfTW91c2VfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0N19Nb3VzZV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgptb3VzZS5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMubW0xMC5zY29yZS5HU00zMDAzNTQ4X01vdXNlX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLm1tMTAuc2NvcmUuR1NNMzAwMzU0OF9Nb3VzZV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5tbTEwLnNjb3JlLkdTTTMwMDM1NDhfTW91c2VfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIikKCiAKCgpkbTYuVE9UQUwuS0NMIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDFfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQxX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kbTYuc2NvcmUuR1NNMzAwMzU0MV9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iKQoKCmRtNi5UT1RBTC5QRFMgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kbTYuc2NvcmUuR1NNMzAwMzU0Ml9Ecm9zb3BoaWxhX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRtNi5zY29yZS5HU00zMDAzNTQyX0Ryb3NvcGhpbGFfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuZG02LnNjb3JlLkdTTTMwMDM1NDJfRHJvc29waGlsYV9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKCgoKdGFpcjEwLlRPVEFMLktDTCA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmJlZF90YWlyMTAuc2NvcmUuR1NNMzAwMzUzNV9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWRfdGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5LLnc1MC4yNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM1X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzVfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIpCgoKdGFpcjEwLlRPVEFMLlBEUyA8LSBlbnJpY2htZW50X0c0X3NlcV9wbG90KCJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX3BsdXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWRfdGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5iZWRfdGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5iZWQudGFpcjEwLnNjb3JlLkdTTTMwMDM1MzZfQXJhYmlkb3BzaXNfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fbWludXMuYmVkLnRhaXIxMC5zY29yZS5HU00zMDAzNTM2X0FyYWJpZG9wc2lzX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LlBEUy53NTAuMzUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmJlZC50YWlyMTAuc2NvcmUuR1NNMzAwMzUzNl9BcmFiaWRvcHNpc19hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKCgpkYW5SZXIxMC5UT1RBTC5LQ0wgPC0gZW5yaWNobWVudF9HNF9zZXFfcGxvdCgifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX3BsdXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX21pbnVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1N19aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl91cF9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIiwKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAifi9Hb29nbGVfRHJpdmUvUmVzdWx0cy9Ob25fQi9HNF9zZXFfMjAxOS9Fdm9sdXRpb24vZXhvbl9kb3duX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NTdfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9wbHVzLmhpdHMubWF4LksudzUwLjI1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU3X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguSy53NTAuMjUuYmVkLnR4dC4ubnVtIikKCgoKZGFuUmVyMTAuVE9UQUwuUERTIDwtIGVucmljaG1lbnRfRzRfc2VxX3Bsb3QoIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX2Rvd25fcGx1cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9wbHVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fdXBfbWludXMuZGFuUmVyMTAuc2NvcmUuR1NNMzAwMzU1OF9aZWJyYWZpc2hfYWxsX3cxNV90aC0xX3BsdXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iLAogICAgICAgICAgICAgICAgICAgICAgICJ+L0dvb2dsZV9Ecml2ZS9SZXN1bHRzL05vbl9CL0c0X3NlcV8yMDE5L0V2b2x1dGlvbi9leG9uX3VwX21pbnVzLmRhblJlcjEwLnNjb3JlLkdTTTMwMDM1NThfWmVicmFmaXNoX2FsbF93MTVfdGgtMV9taW51cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfcGx1cy5oaXRzLm1heC5QRFMudzUwLjM1LmJlZC50eHQuLm51bSIsCiAgICAgICAgICAgICAgICAgICAgICAgIn4vR29vZ2xlX0RyaXZlL1Jlc3VsdHMvTm9uX0IvRzRfc2VxXzIwMTkvRXZvbHV0aW9uL2V4b25fZG93bl9taW51cy5kYW5SZXIxMC5zY29yZS5HU00zMDAzNTU4X1plYnJhZmlzaF9hbGxfdzE1X3RoLTFfbWludXMuaGl0cy5tYXguUERTLnc1MC4zNS5iZWQudHh0Li5udW0iKQoKYGBgCgoKYGBge3J9CgpoZzE5LlRPVEFMLktDTFssIFRyZWF0bWVudDo9IktDbCJdIApoZzE5LlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCmhnMTkuVE9UQUwuS0NMWywgU3BlY2llczo9IkguIHNhcGllbnMiXSAKaGcxOS5UT1RBTC5QRFNbLCBTcGVjaWVzOj0iSC4gc2FwaWVucyJdICAKCnNhY0NlcjMuVE9UQUwuS0NMWywgVHJlYXRtZW50Oj0iS0NsIl0gIApzYWNDZXIzLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCnNhY0NlcjMuVE9UQUwuS0NMWywgU3BlY2llczo9IlMuIGNlcmV2aXNpYWUiXSAgCnNhY0NlcjMuVE9UQUwuUERTWywgU3BlY2llczo9IlMuIGNlcmV2aXNpYWUiXSAgCgptb3VzZS5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCm1vdXNlLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdIAptb3VzZS5UT1RBTC5LQ0xbLCBTcGVjaWVzOj0iTS4gbXVzY3VsdXMiXSAgCm1vdXNlLlRPVEFMLlBEU1ssIFNwZWNpZXM6PSJNLiBtdXNjdWx1cyJdICAKCmRtNi5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCmRtNi5UT1RBTC5QRFNbLCBUcmVhdG1lbnQ6PSJQRFMiXQpkbTYuVE9UQUwuS0NMWywgU3BlY2llczo9IkQuIG1lbGFub2dhc3RlciJdICAKZG02LlRPVEFMLlBEU1ssIFNwZWNpZXM6PSJELiBtZWxhbm9nYXN0ZXIiXSAgCgp0YWlyMTAuVE9UQUwuS0NMWywgVHJlYXRtZW50Oj0iS0NsIl0gCnRhaXIxMC5UT1RBTC5QRFNbLCBUcmVhdG1lbnQ6PSJQRFMiXSAKdGFpcjEwLlRPVEFMLktDTFssIFNwZWNpZXM6PSJBLiB0aGFsaWFuYSJdIAp0YWlyMTAuVE9UQUwuUERTWywgU3BlY2llczo9IkEuIHRoYWxpYW5hIl0gCgpkYW5SZXIxMC5UT1RBTC5LQ0xbLCBUcmVhdG1lbnQ6PSJLQ2wiXSAgCmRhblJlcjEwLlRPVEFMLlBEU1ssIFRyZWF0bWVudDo9IlBEUyJdCmRhblJlcjEwLlRPVEFMLktDTFssIFNwZWNpZXM6PSJELiByZXJpbyJdICAKZGFuUmVyMTAuVE9UQUwuUERTWywgU3BlY2llczo9IkQuIHJlcmlvIl0KCgpUT1RBTC5LQ0xfUERTIDwtICByYmluZChoZzE5LlRPVEFMLktDTCwgaGcxOS5UT1RBTC5QRFMsIHNhY0NlcjMuVE9UQUwuS0NMLCBzYWNDZXIzLlRPVEFMLlBEUywgbW91c2UuVE9UQUwuS0NMLCBtb3VzZS5UT1RBTC5QRFMsIGRtNi5UT1RBTC5LQ0wsIGRtNi5UT1RBTC5QRFMsIHRhaXIxMC5UT1RBTC5LQ0wsIHRhaXIxMC5UT1RBTC5QRFMsIGRhblJlcjEwLlRPVEFMLktDTCwgZGFuUmVyMTAuVE9UQUwuUERTKQoKCmdncGxvdChUT1RBTC5LQ0xfUERTKSArCiAgZ2VvbV9saW5lKGFlcyhQb3NpdGlvbiwgRW5ycmljaG1lbnQsIGNvbG91cj1TcGVjaWVzKSkgKwogIHhsaW0oYygtMTAwMCwgMTAwMCkpICsKICBmYWNldF9ncmlkKFRyZWF0bWVudCB+IGV4b25fcG9zKSArCiAgeGxhYigiRGlzdGFuY2UiKSArCiAgeWxhYigiRW5yaWNobWVudCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpIAoKYGBgCgoKCgoKCgpgYGB7cn0KY2xvc2VzdF9nNF9LQ0wuaGcxOS4yMDE1IDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIpCgoKY2xvc2VzdF9nNF9LQ0wuaGcxOS4yMDE1IDwtIGNsb3Nlc3RfZzQoIi4vRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fdXBfcGx1cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZ3VyZXMvU3VwcGxlbWVudGFyeS9leG9uX3VwX21pbnVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9wbHVzLmhnMTkuY2xvc2VzdC5HU0U2Mzg3NF9OYV9LX3BsdXNfbWludXNfaGl0c19pbnRlcnNlY3QuYmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlcy9TdXBwbGVtZW50YXJ5L2V4b25fZG93bl9taW51cy5oZzE5LmNsb3Nlc3QuR1NFNjM4NzRfTmFfS19wbHVzX21pbnVzX2hpdHNfaW50ZXJzZWN0LmJlZCIpCmBgYAoKCgpgYGB7cn0KS0NMX3VwIDwtIHVuaXF1ZShjbG9zZXN0X2c0X0tDTFthYnMoZGlzdCk+PTEwMCAmIHBvcz09IjMnU3BsaWNlIHNpdGUiLCBwYXN0ZShlY2hyb20sIGVzdGFydCwgZWVuZCwgc2VwID0gIl8iKV0pCgoKYGBgCgoKCgoKCgoKYGBge3J9CmdnX2NvbG9yX2h1ZSA8LSBmdW5jdGlvbihuKSB7CiAgaHVlcyA9IHNlcSgxNSwgMzc1LCBsZW5ndGggPSBuICsgMSkKICBoY2woaCA9IGh1ZXMsIGwgPSA2NSwgYyA9IDEwMClbMTpuXQp9CgpnZ19jb2xvcl9odWUoMykKYGBgCgoKYGBge3J9CgoKIGxpYnJhcnkoZXVsZXJyKQoKCgoKVmVubkRpYWcudXAgPC0gZXVsZXIoYygiTW90aWYiID0gODgwNys5MzI1LCAgCiAgICAgICAgICAgICAgICAgICAgIksiID0gOTY1MysxMDAyOSwgIAogICAgICAgICAgICAgICAgICAgICJQRFMiID0gMzQ4ODArMzY5MDksIAogICAgICAgICAgICAgICAgICAgICJLJlBEUyIgPSA5ODkwKzk1MzksCiAgICAgICAgICAgICAgICAgICAgIlBEUyZNb3RpZiIgPSA4MzMxKzg4NTUsCiAgICAgICAgICAgICAgICAgICAgIksmTW90aWYiID0gNDUwOSs0NzQ5LAogICAgICAgICAgICAgICAgICAgICJLJlBEUyZNb3RpZiIgPSA0NTAzKzQ3NDcpKQpGaWcxLkMxIDwtIHBsb3QoVmVubkRpYWcudXAsIGNvdW50cyA9IFRSVUUsIGZvbnQ9MiwgY2V4PTEsIGFscGhhPTAuNSwKICAgICBmaWxsPWdnX2NvbG9yX2h1ZSgzKSwgcXVhbnRpdGllcyA9IGxpc3QoZm9udHNpemUgPSAxMCkpCgoKVmVubkRpYWcuZG93biA8LSBldWxlcihjKCJNb3RpZiIgPSA5NTA3KzEwMTQyLCAgCiAgICAgICAgICAgICAgICAgICAgIksiID0gMTAxMjArOTM2NSwgIAogICAgICAgICAgICAgICAgICAgICJQRFMiID0gMzQ4NDQrMzY3MzcsIAogICAgICAgICAgICAgICAgICAgICJLJlBEUyIgPSA5MjM2Kzk5ODUsCiAgICAgICAgICAgICAgICAgICAgIlBEUyZNb3RpZiIgPSA4OTczKzk1OTMsCiAgICAgICAgICAgICAgICAgICAgIksmTW90aWYiID0gNDgwNis1MjIxLAogICAgICAgICAgICAgICAgICAgICJLJlBEUyZNb3RpZiIgPSA0ODAyKzUyMTEpKQpGaWcxLkMyIDwtIHBsb3QoVmVubkRpYWcuZG93biwgY291bnRzID0gVFJVRSwgZm9udD0xLCBjZXg9MSwgYWxwaGE9MC41LAogICAgIGZpbGw9Z2dfY29sb3JfaHVlKDMpLCAgcXVhbnRpdGllcyA9IGxpc3QoZm9udHNpemUgPSAxMCkpCgoKRmlnMS5DIDwtIHBsb3RfZ3JpZChGaWcxLkMxLCBGaWcxLkMyLCBucm93PTEpCkZpZzEuQwpgYGAKCgpgYGB7cn0KCgpWZW5uRGlhZy51cF8yMDE1IDwtIGV1bGVyKGMoIk1vdGlmIiA9IDE4MTMyLCAgCiAgICAgICAgICAgICAgICAgICAgIksiID0gMzQ3NjEsICAKICAgICAgICAgICAgICAgICAgICAiUERTIiA9IDUwODk0LCAKICAgICAgICAgICAgICAgICAgICAiSyZQRFMiID0gMzE3MTEsCiAgICAgICAgICAgICAgICAgICAgIlBEUyZNb3RpZiIgPSAxNDc4NiwKICAgICAgICAgICAgICAgICAgICAiSyZNb3RpZiIgPSAxMTc5NCwKICAgICAgICAgICAgICAgICAgICAiSyZQRFMmTW90aWYiID0gMTEyNTApKQp2ZW5uX3N1cHAudXAgPC0gcGxvdChWZW5uRGlhZy51cF8yMDE1LCBjb3VudHMgPSBUUlVFLCBmb250PTIsIGNleD0xLCBhbHBoYT0wLjUsCiAgICAgZmlsbD1nZ19jb2xvcl9odWUoMyksIHF1YW50aXRpZXMgPSBsaXN0KGZvbnRzaXplID0gMTApKQoKClZlbm5EaWFnLmRvd25fMjAxNSA8LSBldWxlcihjKCJNb3RpZiIgPSAxOTY0OSwgIAogICAgICAgICAgICAgICAgICAgICJLIiA9IDMzOTA4LCAgCiAgICAgICAgICAgICAgICAgICAgIlBEUyIgPSA0OTgwNiwgCiAgICAgICAgICAgICAgICAgICAgIksmUERTIiA9IDMwOTIwLAogICAgICAgICAgICAgICAgICAgICJQRFMmTW90aWYiID0gMTU5NTEsCiAgICAgICAgICAgICAgICAgICAgIksmTW90aWYiID0gMTI2MTUsCiAgICAgICAgICAgICAgICAgICAgIksmUERTJk1vdGlmIiA9IDEyMDI3KSkKdmVubl9zdXBwLmRvd24gPC0gcGxvdChWZW5uRGlhZy5kb3duXzIwMTUsIGNvdW50cyA9IFRSVUUsIGZvbnQ9MSwgY2V4PTEsIGFscGhhPTAuNSwKICAgICBmaWxsPWdnX2NvbG9yX2h1ZSgzKSwgIHF1YW50aXRpZXMgPSBsaXN0KGZvbnRzaXplID0gMTApKQoKcGxvdF9ncmlkKHZlbm5fc3VwcC51cCwgdmVubl9zdXBwLmRvd24sIGxhYmVscyA9IGMoIjMnIFNwbGljZSBzaXRlIiwgIjUnIFNwbGljZSBzaXRlIikpCgpgYGAKCgoKYGBge3J9CmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzIDwtIGZyZWFkKCIuL0ZpZ3VyZXMvRmlndXJlMS9kYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llcyIpCgpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19tYXRyaXggPC0gdChkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llcykKCgoKaGVhZGVyIDwtIGFzLmNoYXJhY3RlcihoZWFkKGRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX21hdHJpeCwgMSkpCgpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZiA8LSBhcy5kYXRhLmZyYW1lKHRhaWwoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfbWF0cml4LCAtMSkpCgpjb2xuYW1lcyhkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZikgPC0gaGVhZGVyCgpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZiRzcGVjaWUgPC0gcm93bmFtZXMoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZGYpCgoKZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQgPC0gZGF0YS50YWJsZShkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kZikKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JG1lZGlhbiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRtZWRpYW4pKQpkYXRhZnJhbWVfRzRfY29uc2Vuc3VzX21vdGlmX2VucmljaG1lbnRfc3BlY2llc19kdCRzdC5kZXYgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkc3QuZGV2KSkKCmRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0JHNwZWNpZSA8LSBmYWN0b3IoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQkc3BlY2llICwgbGV2ZWxzPWRhdGFmcmFtZV9HNF9jb25zZW5zdXNfbW90aWZfZW5yaWNobWVudF9zcGVjaWVzX2R0W29yZGVyKC1tZWRpYW4pXSRzcGVjaWUpCgoKCmBgYAoKYGBge3J9CkZpZzYuQSA8LSBnZ3Bsb3QoZGF0YWZyYW1lX0c0X2NvbnNlbnN1c19tb3RpZl9lbnJpY2htZW50X3NwZWNpZXNfZHQsIGFlcyh4ID0gc3BlY2llLCB5PW1lZGlhbikgKSArCiAgZ2VvbV9iYXIoIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSJibGFjayIsIGZpbGw9IndoaXRlIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSAobWVkaWFuIC0gc3QuZGV2KSwgeW1heCA9IChhcy5udW1lcmljKG1lZGlhbikgKyBhcy5udW1lcmljKHN0LmRldikpKSwgY29sb3VyPSJyZWQiICwgd2lkdGg9MC4yKSArCiAgdGhlbWVfYncoKSsKICB4bGFiKCJTcGVjaWVzIikgKwogIHlsYWIoIkRlbnNpdHkgKEc0cyAvIGtCKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkKCkZpZzYuQQoKYGBgCgpgYGB7cn0KCmRhdGFmcmFtZV9ldm9fUERTX0sgPC0gZnJlYWQoIi4vRmlndXJlcy9GaWd1cmUxL2RhdGFmcmFtZV9ldm9fUERTX0siKQoKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXggPC0gdChkYXRhZnJhbWVfZXZvX1BEU19LKQoKCgpoZWFkZXIgPC0gYXMuY2hhcmFjdGVyKGhlYWQoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIDEpKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kZiA8LSBhcy5kYXRhLmZyYW1lKHRhaWwoZGF0YWZyYW1lX2V2b19QRFNfS19tYXRyaXgsIC0xKSkKCmNvbG5hbWVzKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpIDwtIGhlYWRlcgoKCmRhdGFmcmFtZV9ldm9fUERTX0tfZGYkU3BlY2llcyA8LSByb3duYW1lcyhkYXRhZnJhbWVfZXZvX1BEU19LX2RmKQoKZGF0YWZyYW1lX2V2b19QRFNfS19kdCA8LSBkYXRhLnRhYmxlKGRhdGFmcmFtZV9ldm9fUERTX0tfZGYpCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UgPC0gcmJpbmQoZGF0YWZyYW1lX2V2b19QRFNfS19kdFsgLCAuKFNwZWNpZXM9U3BlY2llcywgVHJlYXRtZW50PSJLKyIsIG1lZGlhbj1LX21lZGlhbiwgc3QuZGV2PUtfc3QuZGV2ICApICBdLApkYXRhZnJhbWVfZXZvX1BEU19LX2R0WyAsIC4oU3BlY2llcz1TcGVjaWVzLCBUcmVhdG1lbnQ9IlBEUyIsIG1lZGlhbj1QRFNfbWVkaWFuLCBzdC5kZXY9UERTX3N0LmRldiAgKSAgXSkKCgpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UkbWVkaWFuIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRtZWRpYW4pKQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2Ukc3QuZGV2IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRzdC5kZXYpKQoKCmdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4ID0gU3BlY2llcywgeT1tZWRpYW4sIGdyb3VwPVRyZWF0bWVudCkpICsKICBnZW9tX2JhciggYWVzKGNvbG91cj1UcmVhdG1lbnQgKSwgc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIsIHBvc2l0aW9uPSJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gKG1lZGlhbiAtIHN0LmRldiksIHltYXggPSAoYXMubnVtZXJpYyhtZWRpYW4pICsgYXMubnVtZXJpYyhzdC5kZXYpKSksIGNvbG91cj0iYmxhY2siICwgd2lkdGg9MC4yLCAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArCiAgdGhlbWVfYncoKSsKICB4bGFiKCJTcGVjaWVzIikgKwogIHlsYWIoIkRlbnNpdHkgKEc0cyAvIGtCKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNywgCiAgICBhbmdsZSA9IDQ1KSkKCgoKZGF0YWZyYW1lX2V2b19QRFNfS19kdF9uaWNlJFNwZWNpZXMgPC0gZmFjdG9yKGRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZSRTcGVjaWVzICwgbGV2ZWxzPWRhdGFmcmFtZV9ldm9fUERTX0tfZHRfbmljZVtUcmVhdG1lbnQ9PSJQRFMiXVtvcmRlcigtbWVkaWFuKV0kU3BlY2llcykKCgpGaWc2LkMgPC0gIGdncGxvdChkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UsIGFlcyh4PVNwZWNpZXMsIHdlaWdodD1tZWRpYW4sIHltaW49bWVkaWFuLXN0LmRldiwgeW1heD1tZWRpYW4rc3QuZGV2LCBncm91cD1UcmVhdG1lbnQpKSArCiAgICAgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgYWVzKHk9bWVkaWFuLCBjb2xvcj1UcmVhdG1lbnQpLCBmaWxsPSJ3aGl0ZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgIGdlb21fZXJyb3JiYXIgKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIGNvbG91cj0iYmxhY2siLCB3aWR0aD0wLjIpICsKICAgIHRoZW1lX2J3KCkrCiAgeGxhYigiU3BlY2llcyIpICsKICB5bGFiKCJEZW5zaXR5IChHNHMgLyBrQikiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcsIAogICAgYW5nbGUgPSA0NSkpCgoKRmlnNi5DCgpgYGAKCmBgYHtyfQpkYXRhZnJhbWVfZXZvX1BEU19LX2R0X25pY2UKYGBgCgoKIyMjIyMjIEZpZ3VyZXMgICMjIyMjCgoKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCkZpZzEuQkMgPC0gcGxvdF9ncmlkKEZpZzEuQiwgRmlnMS5DLCBuY29sPTEsIGxhYmVscyA9IGMoIkIiLCAiQyIpLCByZWxfaGVpZ2h0cyA9IGMoMiwgMSkpCgpGaWcxIDwtIHBsb3RfZ3JpZChGaWcxLkEsIEZpZzEuQkMsIG5yb3c9MSwgbGFiZWxzID0gYygiQSIsICIiKSkKCkZpZzEKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03fQoKRmlnMiA8LSBwbG90X2dyaWQoRmlnMi5BLCBGaWcyLkIsbmNvbCA9IDEgLCBsYWJlbHMgPSJBVVRPIiwgcmVsX2hlaWdodHMgPSBjKDEuNSwgMSkpCkZpZzIKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTE0fQpGaWczIDwtIHBsb3RfZ3JpZChGaWczLkEsIEZpZzMuQiwgRmlnMy5DLCBGaWczLkQsIGxhYmVscyA9ICJBVVRPIiwgbmNvbD0yKQpGaWczCmBgYAoKCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMy4zNX0KCgoKRmlnNS5ib3R0b20gPC0gcGxvdF9ncmlkKEZpZzUuQSwgRmlnNS5CLCBGaWc1LkMsIEZpZzUuRCwgbnJvdyA9IDIsIG5jb2wgPSAyICwgbGFiZWxzID0gYygiQiIsICJDIiwgIkQiLCAiRSIpLCByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSwgMSkpCgpGaWc1IDwtIHBsb3RfZ3JpZChGaWc1LkExLCBGaWc1LmJvdHRvbSwgbnJvdz0yLCBsYWJlbHMgPSBjKCJBIiwgIiIpLCAgcmVsX2hlaWdodHMgPSBjKDIsIDQpKQoKRmlnNQpgYGAKCgoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKCkZpZzYudG9wIDwtIHBsb3RfZ3JpZChGaWc2LkEsIEZpZzYuQywgbGFiZWxzID0gYygiQSIsICJDIikpCkZpZzYuYm90dG9tIDwtIHBsb3RfZ3JpZChGaWc2LkIsIEZpZzYuRCwgbGFiZWxzID0gYygiQiIsICJEIikpCgpGaWc2IDwtIHBsb3RfZ3JpZChGaWc2LkEsIEZpZzYuQywgRmlnNi5CICwgRmlnNi5ELCBsYWJlbHMgPSBjKCJBIiwgIkMiLCAiQiIsICJEIikgLCBuY29sPTIsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAzLCAzKSkKCgpGaWc2IDwtIHBsb3RfZ3JpZChGaWc2LnRvcCwgRmlnNi5ib3R0b20sIHJlbF9oZWlnaHRzID0gYygxLCAxLjUpLCBucm93PTIpCkZpZzYKYGBgCgoKCg==